我是MVC的新手。我有一个代码,它只是要从控制器填充viewdata并将其传递给视图。看看代码吧。
控制器
public ActionResult Edit(int id)
{
ViewData["Name"] = "My name is XYZ";
return View();
}
查看页面
@Html.TextBox("Name")
我的问题是文本框如何理解提取名称并将其显示为文本框值。基本上名称存储在viewdata中。首先,我们需要从viewdata中取出数据,然后我们可以将这些数据作为值分配给textbox。这个怎么运作 ?。
有人解释但事情对我来说不是很清楚
MVC采用默认协议设计,用于查找关键字并尝试与这些关键字建立关联。您已选择使用“名称”作为临时数据对象。然后,MVC将努力寻找具有相同名称的任何元素。它认为您打算为与ViewData对象同名的元素分配,因为您希望它与之关联。
ViewBag也是如此。您可以为ViewBag指定一个名称(ViewBag.Name),并且只要您对元素使用'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 %>/>
然后我会得到错误但是如果我们这样编写{{ 1}}然后它会工作。所以如果我们只指定<asp:textbox value=<% viewstate["Name"] as string %>/>
假设名称可以存储在session,viewdata,viewbag,tempdata等中,那么MVC引擎如何解决呢?用更多的例子寻找好的解释。 感谢
答案 0 :(得分:0)
我的问题是文本框如何理解提取名称并将其显示为文本框值。
这都是神奇的弦乐。您已将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个属性:一个简单的标量属性来绑定选定的值,一个集合属性来绑定下拉列表中的可用值。
就像那样:
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就越好。