mvc如何提交viewmodel?

use*_*329 3 asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我目前希望用户更新数据列表并能够将其提交回来。用户正在更新的数据是类似的数据,目前它是一些文本框。他们更新信息并将其提交回来。

目前我已经创建了以下 viewModel

public class Name
{
    public int Id { get; set; }
    public string FullName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这将保存数据。所以从控制器我现在正在嘲笑数据

public ActionResult Index()
{

    var listOfNames = new List<Name>();

    var name1 = new Name();
    name1.Id = 1;
    name1.FullName = "Test Name1";

    var name2 = new Name();
    name2.Id = 2;
    name2.FullName = "Test Name2";

    var name3 = new Name();
    name3.Id = 3;
    name3.FullName = "Test Name3";

    var name4 = new Name();
    name4.Id = 4;
    name4.FullName = "Test Name4";

    listOfNames.Add(name1);
    listOfNames.Add(name2);
    listOfNames.Add(name3);
    listOfNames.Add(name4);

    return View(listOfNames);
}
Run Code Online (Sandbox Code Playgroud)

然后视图如下所示,

@model IEnumerable<MvcApplication1.Models.Name>
@using (Html.BeginForm())
{
    foreach (var item in Model)
    {
        @Html.TextBox("namevalues", item.FullName, new { id = "name" + item.Id, data_id = item.Id})
    <br />
    }

    <input type="submit" />
}
Run Code Online (Sandbox Code Playgroud)

当用户提交数据时,我希望重新填充视图模型,以便我应该能够执行以下操作

[HttpPost]
public ActionResult Index(IEnumerable<Name> names)
{

    return View("index", names);
}
Run Code Online (Sandbox Code Playgroud)

我是否需要使用 javascript 将信息实际整理在一起然后传递?还是有一些我不知道的 MVC 魔法?

Bre*_*ogt 5

不,你不需要 JavaScript。您可以使用可以绑定到视图的视图模型。我不喜欢将域模型传递给视图,我更喜欢在数据方面缩小得多的视图模型。它可以是这样的:

public class NameListViewModel
{
     public List<Name> Names { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在您需要在控制器中填充名称列表,如下所示:

public ActionResult Index()
{
     NameListViewModel viewModel = new NameListViewModel();
     viewModel.Names = new List<Name>();
     viewModel.Names.Add(new Name { Id = 1, FullName = "Test Name1" });
     viewModel.Names.Add(new Name { Id = 2, FullName = "Test Name2" });
     viewModel.Names.Add(new Name { Id = 3, FullName = "Test Name3" });
     viewModel.Names.Add(new Name { Id = 4, FullName = "Test Name4" });

     return View(viewModel);
}

[HttpPost]
public ActionResult Index(NameListViewModel viewModel)
{
     // All the values should still be in viewModel
     // Do whatever you need to do
}
Run Code Online (Sandbox Code Playgroud)

然后在您的视图中,您可以使用如下文本框数组:

@model YourProject.ViewModels.Names.NameListViewModel

@for (int i = 0; i < Model.Names.Count(); i++)
{
     <div>
          @Html.TextBoxFor(x => x.Names[i].FullName)
          @Html.HiddenFor(x => x.Names[i].FullName)
     </div>
}
Run Code Online (Sandbox Code Playgroud)

尝试一下,看看是否有效。修改代码以适合您的场景并执行您需要的其余操作。

我希望这有帮助。