MVC3,从列表中获取更新的表单数据

时间:2011-03-03 20:54:50

标签: c# asp.net asp.net-mvc-3

我有一个强类型视图,其中包含模型中的自定义对象列表。

在视图中,我显示列表中每个对象的文本框:

@using (Html.BeginForm("SaveData", "Localization", FormMethod.Post))
{
        foreach (YB.LocalizationGlobalText m in Model.GlobalTexts)
    { 
            @Html.Label(m.LocalizationGlobal.Name)
            @Html.TextBoxFor(model => m.Text)
            <br />
    }   
    <input type="submit" value="Save" />
}

现在我如何从模型中的文本框中获取更新的数据。 我可以在formcollection中看到更新的数据:

    [HttpPost]
    public virtual ActionResult SaveData(FormCollection form)
    {
        // Get movie to update
        return View();
   }

form [“m.Text”] =“testnewdata1,testnewdata”

但是如何将其映射到模型,因此我有每个对象的更新值。 或者我怎样才能从formcollection中得到它,就像这样.. form [someid] [“m.Text”]

编辑:

我也尝试将模型作为参数传递,但模型数据为空。

[HttpPost]
        public virtual ActionResult SaveData(LocalizationModel model, FormCollection form)
        {
            // Get movie to update
            return View();
       }

当我查看模型时:model.GlobalTexts = null

2 个答案:

答案 0 :(得分:2)

[HttpPost]
public virtual ActionResult SaveData(int movieId, FormCollection form)
{
    // Get movie to update
    Movie movie = db.Movies.Where(x => x.Id == movieId);
    // Update movie object with values from form collection.
    TryUpdateModel(movie, form);
    // Do model validation
    if (!ModelState.IsValid)
        return View();
    return View("success");
}

修改看到这个问题,我问过一段时间:How to use multiple form elements in ASP.NET MVC

假设您有这样的观点:

@model IEnumerable<CustomObject>

@foreach (CustomObject customObject in Model)
{
    <div>
        @Html.TextBox(customObject.CustomProperty);
        <!-- etc etc etc -->
    </div>
}

像这样重写:

@model IEnumerable<CustomObject>

    @for (int count = 0; count < Model.Count(); count++)
    {
        <div>
            <!-- Add a place for the id to be stored. -->
            @Html.HiddenFor(x => x[count].Id);

            @Html.TextBoxFor(x => x[count].CustomProperty);
            <!-- etc etc etc -->
        </div>
    }

现在在你的行动方法中这样做:

public virtual ActionResult SaveData(IEnumerable<CustomObject>)
{
    // You now have a list of custom objects with their IDs intact.
}

如果你使用编辑器,那就更容易了,但是我会让你自己解决这些问题,因为它们非常简单。我链接的问题中接受的答案显示了一个例子。

注意:如果需要,可以将IList替换为IEnumerable。

答案 1 :(得分:0)

如果我理解你的问题,你可以简单地使用你的viewmodel作为SaveData的参数,它会自动映射它:

[HttpPost]
public virtual ActionResult SaveData(ViewModelType viewmodel)
{
    // Get movie to update
    return View();
}