1

我是 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 %>/>那么它会起作用。那么如果我们简单地指定,MVC 是如何理解的@Html.TextBox("Name")

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

4

1 回答 1

0

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

都是魔线。您已将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 越好。

于 2013-07-15T08:46:20.410 回答