【问题标题】:ASP.NET MVC FormCollection TextAreaASP.NET MVC FormCollection 文本区域
【发布时间】:2011-08-19 19:26:25
【问题描述】:

我有一个代表描述字段的文本区域。描述有逗号,因此在尝试拆分字段的描述时,无法正确解析数据。如何正确获取每一行的描述。

     var DescList = FormValues["Item.Description"].Split(',').Select(item => item).ToList<string>();
//will not work for obvious reasons. Comma delimited FormCollection has commas to identify separate row data.

微软在设计 FormsCollection 时似乎没有考虑 textarea 控件。尝试访问每个值时,带有逗号的文本区域将不起作用。有趣的是 _entriestables 属性具有完美的格式,但他们选择将其设为私有属性。非常沮丧。

`

Here is the important part of my viewmodel.
 public class TenantViewModel
{
    public Tenant Tenant { get; set; }
                public Site Site { get; set; }

    }

我的视图是这样填充的:

    if (Model != null && Model.Tenant != null && Model.Tenant.Site != null && Model.Tenant.Site.Count() > 0)
    {<div class="detailsbox_view">
        <table id="tblTenantSites">
            <tr>
                <th>@Html.LabelFor(item => item.Site.Title)</th>
                <th>@Html.LabelFor(item => item.Site.Description)</th>

            </tr>
        @foreach (var Item in Model.Tenant.Sites)
           {
            <tr>
                @Html.HiddenFor(modelItem => Item.SiteId)


                <td>
                    @Html.EditorFor(modelItem => Item.Title)
                                        </td>
                <td>
                    @Html.TextAreaFor(modelItem => Item.Description, new {@width="400" })

                </td>

            </tr>   }
        </table>

如您所见,此站点表是租户对象的子对象。此子记录不会使用此方法自动更新,但租户数据会自动更新。这就是我尝试使用 FormColelction 的原因。 有什么我缺少的东西来完成这项工作吗?

【问题讨论】:

  • 你能发布一个你的模型和输入的例子吗?
  • 没有理由使用FormValues['whatever']。您应该将模型提交回控制器
  • 你能发布你的视图吗?
  • 谢谢。我刚刚更新了我的问题。
  • 我猜你让你的用户能够在一个视图/页面中编辑多个网站的描述。您遇到了集合绑定问题,这是新 MVC 开发人员常见的问题。如果您只是决定一次只允许用户编辑一个站点,则可以轻松避免这种情况。而且,恕我直言,它还将提供更好的用户体验。

标签: asp.net-mvc formcollection


【解决方案1】:

试试这个有用的功能

ValueProviderResult Match=FormCollection.GetValue("ValueProvider");

【讨论】:

    【解决方案2】:

    当您有多个具有相同name 属性的字段时,它们将作为数组返回到您的FormCollection。因此,在发布这样的视图时:

    <form action="/Home/MyAction">
        <textarea id="row_one_description" name="description">
            First row's description
        </textarea>
        <textarea id="row_two_description" name="description">
            Second row's description
        </textarea>
    
        <input type="submit" value="Submit" />
    </form>
    

    你可以在你的行动中做这样的事情

    [HttpPost]
    public ActionResult MyAction(FormCollection collection) 
    {
        var descriptionArray = collection["description"];
    
        string firstRowDescription = descriptionArray[0];
        string secondRowDescription = descriptionArray[1];
    }
    

    我必须注意,这不是处理已发布数据的推荐方式。相反,您应该使用来自视图模型的数据来构建视图,并使用强类型的 html 帮助器来呈现您的控件。这样,当您发布时,您的操作可以将 ViewModel 作为参数。它的属性将被自动绑定,您将拥有一个不错的对象。

    [HttpPost]
    public ActionResult MyAction(MyViewModel viewModel) 
    {
        foreach (var row in viewModel.Rows)
        {
            string description = row.Description;
        }
    }
    

    编辑
    我仍然对您的 ViewModel 做了很多假设,但也许可以试试这个:

    <table id="tblTenantSites">
        <tr>
            <th>@Html.LabelFor(model => model.Site.Title)</th>
            <th>@Html.LabelFor(model => model.Site.Description)</th>
        </tr>
    
        @for (var i = i < Model.Tenants.Sites.Count(); i++) {
        <tr>
            @Html.HiddenFor(model => model.Tenants.Sites[i].SiteId)
    
            <td>
                @Html.EditorFor(model => model.Tenants.Sites[i].Title)
            </td>
            <td>
                @Html.TextAreaFor(model => model.Tenants.Sites[i].Description, new { @width="400" } )
            </td>
    
        </tr>   
        }
    
    </table>
    

    【讨论】:

    • 我该怎么做。当我执行以下操作时,它已经有逗号分隔的描述:foreach(FormValues.Keys 中的 var 键){ if (key.ToString() == "Item.Description") { var value = FormValues[key.ToString()] ; } }
    • 哦,我明白了,我以为您的意思是用户应该在文本区域中输入逗号分隔的数据。由于您没有为您的视图包含代码,因此这个问题变得非常困难。用可能有帮助的东西更新了我的答案...?
    【解决方案3】:

    你也可以试试,

       string Match=FormCollection.GetValue("ValueProvider").AttemptedValue;
    

    【讨论】:

      猜你喜欢
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 2010-11-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      相关资源
      最近更新 更多