【问题标题】:I'm trying to conver this Web form app to my MVC app, full newbie here我正在尝试将此 Web 表单应用程序转换为我的 MVC 应用程序,这里是新手
【发布时间】:2019-09-26 21:12:01
【问题描述】:

我正在尝试将此 Webform 应用程序转换为 MVC 应用程序

如何在控制器视图中访问我的列表框?

我是个新手

这是网络表单:

protected void btnPrintToken_Click(object sender, EventArgs e)
{
        Queue<int> tokenQueue = (Queue<int>)Session["TokenQueue"];
        lblStatus.Text = "There are" + tokenQueue.Count.ToString()+
        " customers before you in the queue;

        if (Session["LastTokenNumberIssued"] == null)
            Session["LastTokenNumberIssued"] = 0;
        }
        int nextTokenNumberTobeIssued = (int)Session["LastTokenNumberIssued"] + 1;
        Session["LastTokenNumberIssued"] = nextTokenNumberTobeIssued;
        tokenQueue.Enqueue(nextTokenNumberTobeIssued);
        foreach(int token in tokenQueue)
        listTokens.Item.Clear();
        {
            listTokens.Items.Add(token.ToString());
        }
}

这是我的 MVC 应用程序:

    public ActionResult PrintToken()
    {
        Queue<int> tokenQueue = (Queue<int>)Session["TokenQueue"];

        if (Session["LastTokenNumberIssued"] == null)
        {
            Session["LastTokenNumberIssued"] = 0;
        }

        int nextTokenNumberTobeIssued = (int)Session["LastTokenNumberIssued"] + 1;
        Session["LastTokenNumberIssued"] = nextTokenNumberTobeIssued;

        tokenQueue.Enqueue(nextTokenNumberTobeIssued);

        foreach(int token in tokenQueue)
        {
            listTokens.Items.Add(token.ToString());
        }

        return View();
    }

它几乎具有相同的视图,但我不知道如何在 MVC 中访问我的视图,就像在“lblStatus.Txt”之类的网络表单中一样

【问题讨论】:

  • 尝试不使用Session[]。你还在用 WebForms 风格思考,那是行不通的。您需要一个 ViewModel 才能通过:return View(myViewModel);
  • 你能告诉我这是怎么回事吗?请我是新手,我还不太明白其中的区别
  • @HenkHolterman 我正在尝试在 mvc youtube.com/watch?v=SIs7ZsMCUWA 中执行此操作

标签: asp.net asp.net-mvc webforms


【解决方案1】:

您可以根据需要使用 ViewBag 或 ViewData 来存储消息

public ActionResult PrintToken()
    {
        Queue<int> tokenQueue = (Queue<int>)Session["TokenQueue"];

       ViewBag.StatusText = "There are" + tokenQueue.Count.ToString()+
        " customers before you in the queue;

        if (Session["LastTokenNumberIssued"] == null)
        {
            Session["LastTokenNumberIssued"] = 0;
        }

        int nextTokenNumberTobeIssued = (int)Session["LastTokenNumberIssued"] + 1;
        Session["LastTokenNumberIssued"] = nextTokenNumberTobeIssued;

        tokenQueue.Enqueue(nextTokenNumberTobeIssued);

        foreach(int token in tokenQueue)
        {
            listTokens.Items.Add(token.ToString());
        }

        return View();
    }

在您的 cshtml 文件中

<label>@ViewBag.StatusText</label>

您也可以将 ViewModel 创建为

class PrintTokenViewModel{
     public List<string> listTokens{get;set;}
     public string StatusText{get;set;}
}

其他解决方案:使用 ViewModel 存储数据

在控制器中

public ActionResult PrintToken()
 {
     var model = new PrintTokenViewModel();
     //handle assign here
     return View(model);
}

查看cshtml

@model PrintTokenViewModel

<ul>
@foreach(var item in Model.ListTokens){
   <li>@item</li>
}
</ul>

<label>@Model.StatusText</label>

【讨论】:

  • 您可以使用旧类作为模型或创建与数据库字段映射的新视图模型
  • 这可能吗。示例:在我的第一页中,我会让人们输入他们的姓名,当他们单击确认时,他们将获得一个数字,然后将他们排入队列。然后在我的第二页中,这是代理的页面,当他们单击下一步时将呼叫人们,它将从数据库中出列?我正在构建一个队列管理系统。
  • 您应该首先使用实体​​框架数据库来处理您的案例
  • 如何在他们填写姓名并自动为他们生成号码然后保存到数据库后立即将他们排入队列
【解决方案2】:

使用 MVC,您不直接与 HTML 元素交互,而是提供视图模型(或者您可以使用 ViewBag)并使用 Razor syntax 动态呈现视图。

以下是将视图模型添加到您的 PrintToken() 操作并呈现您的消息所需的步骤:

第 1 步) 创建一个视图模型,该模型代表您要在视图上显示的所有动态值:

public class SampleViewModel
{
  public string StatusMessage { get; set; }
}

第 2 步) 实例化视图模型的实例,填充属性并返回视图:

public ActionResult PrintToken()
{
    // Create instance of your view model
    var viewModel = new SampleViewModel();

    // Somewhere within your code set the StatusMessage
    viewModel.StatusMessage =  $"There are {tokenQueue.Count.ToString()} customers before you in the queue";

    // Return the view model with the view
    return View(viewModel);
}

步骤 3) 在视图中指定视图模型,然后渲染属性:

<!-- Declare the model on the very top (first line) of your view -->
<!-- Note: This should be the full path including namespace -->
@model SampleViewModel

<!-- Render the property from the view-->
<p>@Model.StatusMessage</p>

【讨论】:

  • 要去试试这个 1
  • 谢谢你的回答,我想这就是我要找的,我只是想让这个 webform 应用程序到 asp.net 有什么建议吗? youtube.com/watch?v=SIs7ZsMCUWA
  • @CarloToribio 这是一个学习 MVC 的好机会,你可以做到!一旦你有了一个工作的 MVC 版本,试着用一个更高效和可扩展的持久性选项替换 Session。
【解决方案3】:

您可以将数据保存在 ViewModel 中并通过 Controller 将其传递给视图,如下所示

public ActionResult PrintToken()
{
      PrintViewModel print = new PrintViewModel();

    return View(print);
}

PrintToken.cshtml
@model  SampleMVC.Models.PrintViewModel
@{
    ViewBag.Title = "PrintToken";
}

<h2>PrintToken</h2>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-05
    • 2020-04-10
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多