我是MVC的新手。我有一个代码,它正要从控制器填充viewdata并将其传递给视图。只是看看代码。
控制器
public ActionResult Edit(int id)
{
ViewData["Name"] = "My name is XYZ";
return View();
}
查看页面
@Html.TextBox("Name")
我的问题是文本框如何理解以提取名称并将其显示为文本框值。基本上,名称存储在viewdata中。首先,我们需要从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 Web形式
如果我们以这种方式将任何内容存储到viewstate或session中,viewstate["Name"]="Mou" or session["Name"]="Mou"
那么我们需要以这种方式在客户端渲染该值,<asp:textbox value=<% name %>/>
那么我会报错,但是如果我们以这种方式编写,<asp:textbox value=<% viewstate["Name"] as string %>/>
那么它将起作用。因此,如果我们简单地指定,MVC将如何理解@Html.TextBox("Name")
假设名称可以存储在会话,视图数据,视图包,临时数据等中,那么MVC引擎如何解析它?寻找更多示例的良好解释。谢谢
我的问题是文本框如何理解以提取名称并将其显示为文本框值。
都是魔力。您已将Name
密钥放入ViewData
:
ViewData["Name"] = "My name is XYZ";
因此,当您使用@Html.TextBox("Name")
帮助程序时,将在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个属性:一个简单的标量属性(用于将所选值绑定到该属性)和一个collection属性(用于将下拉列表中的可用值绑定)。
就像这样:
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越好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句