获取View中的控件ID到Controller

时间:2016-03-17 16:16:48

标签: c# asp.net-mvc

在我的MVC应用程序中,我有一个视图,我将在SQL表中显示不同的数据。这将生成不同数量的下拉列表和文本框,具体取决于从模型传入的内容。

我的问题是,如果我想使用那些数据,我似乎无法弄清楚如何将控件X与SQL中的对象Y相关联。例如,如果我有2个文本框我想要更新,那么当Post在我的应用程序中发生时,FormCollection参数将让我看到对象的值,但不能看到它们的控件名称或任何形式的识别因素。

我可以将Value设置为输入值+名称的组合,然后拆分它,但它看起来非常像一个懒惰的解决方法。

我尝试为每个人分配一个ID,例如:

    @foreach (DataObject item in Model.AllDataObjects)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Data)
            </td>
            <td>
                @if (item.Rule.Contains("Yes;No"))
                {
                    @Html.DropDownListFor(model => item.Value, new List<SelectListItem>
                        {
                            new SelectListItem {Text="Yes", Value="Yes"},
                            new SelectListItem {Text="No", Value="No" }
                            }, new { @id = item.ObjectId });
                }
                else
                {
                    @Html.TextAreaFor(model => item.Value, new { style = "width: 400px;", @rows = 5, @id = item.ObjectId  })
                }
            </td>
        </tr>
    }

编辑:以下是我在Controller中的Post ActionResult方法,虽然它不完整,因为我无法弄清楚如何从FormCollection获取控件的ID

    [HttpPost]
    [ValidateInput(false)]
    public ActionResult UpdateData(FormCollection collection, int objectId=0)
    {
        try
        {
                int propertyTypeId = 0;
                string propertyValue = string.Empty;

            // Get all the control values from the collection
            string[] allValues = new string[] { };
            IValueProvider valueProvider = collection.ToValueProvider();
            foreach(string key in collection.Keys)
            {
                ValueProviderResult result = valueProvider.GetValue(key);

                allValues = result.RawValue as string[];

            }

                ObjectData objectData = _execution.GetObjectDetails(0);

                UpdateDataResponse result = _execution.UpdateData(0, objectId,
                    objectValue, UserName);

                return RedirectToAction("Details",
                    new { ObjectId = objectData.ObjectId, error = result.ErrorMessage });
        }
        catch (Exception ex)
        {
          // My exception handling here
        }
    }

所以我可以在标记中看到控件被分配了对象ID作为他们自己的ID,但是我怎么能得到它呢?当我检查FormCollection时,我只看到每个控件的值,但无法识别哪个是哪个。

编辑:我正在使用MVC第4版。

1 个答案:

答案 0 :(得分:0)

表单仅提交其成功控件的值(作为基于控件namevalue属性的名称/值对),因此如果您不为{{1}生成控件}属性,它们不会被提交。

但是,您当前使用ObjectId循环将不允许您从发布的数据中获取任何含义信息,因为您的所有名称都相同且无法可靠地匹配哪个值属于哪个集合中的项目。而是在视图中使用foreach循环或for并绑定到您的模型,而不是使用EditorTemplate

视图应为

FormCollection

假设视图中的模型为@for (int i = 0; i < Model.AllDataObjects.Count; i++) { <tr> <td>@Html.DisplayFor(m => m.AllDataObjects[i].Name)</td> <td>@Html.DisplayFor(m => m.AllDataObjects[i].Data)</td> <td> @Html.HiddenFor(m => m.AllDataObjects[i].ObjectId) @if (Model.AllDataObjects[i].Rule.Contains("Yes;No")) { @Html.DropDownListFor(m => m.AllDataObjects[i].Value, new SelectList(new string[]{ "Yes", "No" })); } else { @Html.TextAreaFor(m => m.AllDataObjects[i].Value, new { style = "width: 400px;", @rows = 5 }) } </td> </tr> } ,请将POST方法更改为

@model MyModel

并且[HttpPost] [ValidateInput(false)] public ActionResult UpdateData(MyModel model) 的值将包含一个正确绑定了model.AllDataObjectsObjectId属性的集合。

有关使用Value循环无效的原因的详细信息,请参阅this answer