如何从FormCollection ASP.NET MVC中分离值

时间:2014-01-23 10:04:50

标签: c# asp.net-mvc

我想向数据库添加新的多记录, 我设计View有多种形式来提交数据并插入它。

我的观点有: - 项目1   @Html.EditorFor(modelitem => item.Description) ... 。 。 。 - 项目2   @Html.EditorFor(modelitem => item.Description) ...

我用

 [HttpPost]
        public ActionResult Edit(FormCollection c)
        {
 var desc = c.GetValue("item.Description");

}

我用它确实得到了价值,但我想分开desc的价值。 我使用.Split(',');但是如果desc有值:

  

“测试值,测试desc”

所以我不能用它。

所以任何人都告诉我。如何循环项目以插入它

3 个答案:

答案 0 :(得分:1)

您可以在字段的id前缀,以便您可以检索两个单独的字段;

@Html.TextBoxFor(x => x.SomeProperty, new { @id = "item_1_description" });

这将允许您从FormCollection中获取该特定值;

string description = c.GetValue("item_1_description");

但是,如果你能利用strongly-typing your views,那就更清洁了。在你的位置,我会创建一个代表你的两个对象的ViewModel。由于我不知道您的数据类型是什么,我将使用Person的示例,看起来像这样;

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

要在一个表单中添加两个人,您将创建一个“ViewModel”来表示表单的外观 - 两个人的扁平版本;

public class MuliplePeopleViewModel
{
  public string Person1Name { get; set; }
  public string Person2Name { get; set; }
}

哪个会生成带有两个文本框的视图;

@model MuliplePeopleViewModel

@Html.EditorFor(x => x.Person1Name);
@Html.EditorFor(x => x.Person2Name);

现在,在您的Controller中,您可以将FormCollection的使用替换为新的ViewModel,这会自动将TextBox的值绑定到相关属性;

[HttpPost]
public ActionResult Edit(MuliplePeopleViewModel viewModel)
{
  string person1Name = viewModel.Person1Name;
}

深思熟虑:我不完全确定DefaultModelBinder会绑定ViewModel的不平整版本,例如;

public class MuliplePeopleViewModel
{
  public Person Person1 { get; set; }
  public Person Person2 { get; set; }
}

但也许你可以尝试一下!

修改

根据作者的评论,您还可以创建包含ViewModel的<{1}};

ICollection<Person>

在您的视图中,您可以遍历每个的集合和显示字段;

public class MuliplePeopleViewModel
{
  public ICollection<Person> People { get; set; }
}

现在,@model MuliplePeopleViewModel @foreach (Person person in Model.People) { @Html.EditorFor(x => person.Name); } 现在应该为您提供在您的操作中使用的人员列表。但是,如果没有,您可能需要写一个custom model binder

更多值得深思:您可以utilise EditorTemplates来简化您的观点。

如果我能进一步提供帮助,请告诉我。

马特

答案 1 :(得分:1)

您也可以使用 -

Request.Form["Your property Name"]

工作代码:

模型 -

public class MyClass
{
    public string MyName { get; set; }
}

查看 -

@using (Html.BeginForm("SubmitData","Post", FormMethod.Post))
{

    <div class="form-horizontal">
        <h4>MyClass</h4>
        <hr />

        @Html.ValidationSummary(true)

        <div class="form-group">
            @Html.LabelFor(model => model.MyName, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.MyName)
                @Html.ValidationMessageFor(model => model.MyName)
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
    </div>
}

在POST上,您可以像这样访问它 -

[HttpPost]
public ActionResult SubmitData(MyClass c)
{
    var name = Request.Form["MyName"];
    return View();

}

我们将在name变量中输入值。检查下图。 enter image description here

同样在上面的代码中我也展示了如何进行模型绑定。如果使用变量'c',那么它也将具有来自UI的值。检查下图。 enter image description here

答案 2 :(得分:0)

试试这个:

[HttpPost]
public ActionResult Edit(FormCollection c, string[] description)
{

}

因此,您将获得数组中的值。