【问题标题】:Regarding assigning model data to textbox in asp.net MVC关于将模型数据分配给 asp.net MVC 中的文本框
【发布时间】:2013-07-15 07:58:04
【问题描述】:

我是 MVC 的新手。我得到了一个代码,它正要从控制器填充视图数据并将其传递给视图。看看代码就行了。

控制器

public ActionResult Edit(int id)
        {
            ViewData["Name"] = "My name is XYZ";
            return View();
        }

查看页面

@Html.TextBox("Name")

我的问题是文本框如何理解提取名称并将其显示为文本框值。基本上名称存储在视图数据中。首先,我们需要从 viewdata 中提取数据,然后我们可以将该数据作为值分配给文本框。这个怎么运作 ?。

有人解释,但事情对我来说不是很清楚

MVC 设计为使用默认协议来查找关键字并尝试与这些关键字建立关联。您已选择将“名称”用于临时数据对象。然后 MVC 将努力寻找任何具有相同名称的元素。它认为您打算为该元素分配与您的 ViewData 对象相同的名称,因为您希望它关联。

ViewBag 也是如此。您可以给 ViewBag 一个名称 (ViewBag.Name),并且任何时候您对元素使用“名称”时,MVC 都会自动假定您希望该元素与 ViewBag 数据相关联。这也适用于列表!

ViewBag.myList = db.Products.ToList();

@Html.DropDownList("myList");

我对 mvc 流程的了解不是很清楚。我是 mvc 的新手。所以我正在阅读 mvc 教程。阅读上述答案后,我不太相信。想想asp.net web 表单。在 asp.net 网络表单中

如果我们像 viewstate["Name"]="Mou" or session["Name"]="Mou" 这样将任何内容存储到视图状态或会话中,那么我们需要像这样在客户端呈现该值 <asp:textbox value=<% name %>/> 然后我会得到错误但是如果我们这样写 <asp:textbox value=<% viewstate["Name"] as string %>/> 那么它会工作。那么如果我们简单地指定@Html.TextBox("Name"),MVC 是如何理解的

假设 name 可以存储在 session、viewdata、viewbag、tempdata 等中,那么 MVC 引擎如何解决它?寻找更多示例的良好解释。 谢谢

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    我的问题是文本框如何理解提取名称并将其显示为文本框值。

    这都是魔术字符串。您已将Name 键放入ViewData

    ViewData["Name"] = "My name is XYZ";
    

    所以当你使用@Html.TextBox("Name") 时,helper 会在 ViewData 中搜索 Name 键并自动绑定数据。

    这让您感到困惑是正常的。不要使用任何 ViewBag/ViewData。改用视图模型。这样,您将不再依赖任何魔术字符串。您将使用强类型助手。例如,假设您想绑定一些简单的 TextBox。继续为它编写一个视图模型:

    public class MyViewModel
    {
        public string Name { get; set; }
    }
    

    然后让您的控制器操作将此模型传递给视图:

    public ActionResult Edit(int id)
    {  
        var model = new MyViewModel();
        model.Name = "My name is XYZ";
        return View(model);
    }
    

    最后使您的视图对模型进行强类型化并使用强类型化助手:

    @model MyViewModel
    ...
    @Html.TextBoxFor(x => x.Name)
    

    你看,MVC 意味着模型/视图/控制器。这并不意味着 ViewData/View/Controller 或 ViewBag/View/Controller。很多人都混淆了这些缩写,完全违背了该模式的目的。他们从不同的来源向视图提供数据,而不仅仅是来自应该提供信息的视图模型。不要像那些人一样。

    既然你谈到了列表,那么再次写以下是完全错误的:

    @Html.DropDownList("myList")
    

    这完全错误的原因是,为了有一个下拉菜单,您需要模型上的 2 个属性:一个简单的标量属性,用于将所选值绑定到一个集合属性,用于绑定下拉列表中的可用值。

    就这样:

    public class MyViewModel
    {
        public string SelectedValue { get; set; }
        public IEnumerable<SelectListItem> Values { get; set; }
    }
    

    通常会在您的控制器中填充:

    public ActionResult Edit(int id)
    {  
        var model = new MyViewModel();
    
        // this usually comes from a database
        model.Values = new[]
        {
            new SelectListItem { Value = "1", Text = "item 1" },
            new SelectListItem { Value = "2", Text = "item 2" },
            new SelectListItem { Value = "3", Text = "item 3" },
        };
    
        // This allows to preselect the second value in the dropdown
        model.SelectedValue = "2";
    
        return View(model);
    }
    

    在视图中:

    @model MyViewModel
    ...
    @Html.DropDownListFor(x => x.SelectedValue, Model.Values)
    

    所以我的建议是越早忘记 ViewData/ViewBag 越好。

    【讨论】:

    • 我对下拉绑定有点困惑。你的 MyViewModel 有两个属性一个是 SelectedValue 另一个是 Values 所以你怎么写 model.Value = "2"; ?没有名为 Value 的属性吗?你还没有展示如何使用 SelectedValue 属性?如果可能,请告诉我如何使用 SelectedValue 属性。谢谢
    • 对不起,这是我的一个错误。应该是model.SelectedValue = "2";。我已经更新了我的答案以反映这一点。
    猜你喜欢
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2012-02-02
    • 2023-04-05
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多