关于在asp.net MVC中将模型数据分配给文本框

时间:2013-07-15 07:58:04

标签: asp.net-mvc

我是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 %>/>

,MVC可以理解

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

1 个答案:

答案 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就越好。