3

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

目前我已经创建了以下视图模型

public class Name
{
    public int Id { get; set; }
    public string FullName { get; set; }
}

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

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);
}

然后视图如下所示,

@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" />
}

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

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

    return View("index", names);
}

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

4

4 回答 4

5

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

public class NameListViewModel
{
     public List<Name> Names { get; set; }
}

现在您需要像这样在控制器中填充名称列表:

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
}

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

@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>
}

试试看它是否有效。修改代码以适应您的场景并完成您需要的其余部分。

我希望这有帮助。

于 2013-07-19T08:03:42.397 回答
0

您的 HTML 中需要有一组文本框。

看看这个有关如何在 MVC 中执行此操作的一些信息:http: //blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

于 2013-07-19T07:54:03.833 回答
0

如果使用@Html.EditorFor(x => x.FullName)该属性,则会绑定到文本框。现在它只是一个带有内容的文本框。

于 2013-07-19T07:49:27.527 回答
-1

尝试使用

@Html.TextBoxFor(m => item.FullName, new { id = "name" + item.Id, data_id = item.Id });

代替

@Html.TextBox("namevalues", item.FullName, new { id = "name" + item.Id, data_id = item.Id})

于 2013-07-19T07:58:29.737 回答