这是这种视图的有效模型吗?

时间:2019-02-08 14:47:25

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

模型正确吗?

public class NewForm
{
    public string[] Field { get; set; }
    public bool[] Check { get; set; }
}

进行这样的查看:

@Html.TextAreaFor(model => model.Field)
@Html.TextAreaFor(model => model.Field)
@Html.TextAreaFor(model => model.Field)

@Html.CheckBoxFor(model => model.Check)
@Html.CheckBoxFor(model => model.Check)

还是有更好的方法来创建相同名称的字段? 在Controller中,仅显示第一个值。但是我需要所有

        [HttpPost]

    public ActionResult Edit(NewForm model)
    {
        Response.Write(model.Field);
        Response.Write(model.Check);
    }

由于以下事实,字段可能是不确定的数字:单击JavaScript按钮会添加一个具有相同名称的同名新字段

3 个答案:

答案 0 :(得分:0)

为什么要使用相同的名称,每个字段都使用适当的名称

public class NewForm
{
    public string FirstField { get; set; }
    public string Field { get; set; }
    public bool Check { get; set; }
}

查看

@Html.TextAreaFor(model => model.FirstField)
@Html.TextAreaFor(model => model.Field)

@Html.CheckBoxFor(model => model.Check)

ee

[HttpPost]
public ActionResult Edit(NewForm model)
{
    Response.Write(model.FirstField);
    Response.Write(model.Field);
    Response.Write(model.Check);
}

答案 1 :(得分:0)

不,不是。在您定义的模型中,您创建了两个不同的数组:第一个属性Field是字符串数组,第二个属性Check是布尔数组。将[]放在类型后面表示数组。

如果您将我称为“迷你表单”的数量未知,而这些数量是由用户通过UI确定的,那么您应该创建一个表示该迷你表单的视图模型和一个容器视图用于容纳它以及视图所需的其他属性的模型。

例如:

public class MiniFormViewModel
{
    public string MyInput { get; set; }
    public bool MyCheck { get; set; }
}

然后在您的容器视图模型中:

public class ContainerViewModel
{ 
    public IEnumerable<MiniFormViewModel> MiniForms { get; set; } 
    //Any other properties you need on the view that will occur a single time 
}

现在,在JS中,您需要添加一些操作才能做到这一点:

function getViewModel() {
    //You'll have to decide how you want to get the values of the mini form's fields. Perhaps you might even have a function to supply these values. Up to you.
    return {
        MiniForms: [{
                MyInput: '', //value from the first "mini form' string field
                Mycheck: false //value from the first "mini-form" bool field
            },
            {
                MyInput: '', //value from the second"mini form' string field
                Mycheck: false //value from the second"mini-form" bool field
            }      
        ]
    }
}

然后,您需要将其发布回服务器。我将通过内置的JS Fetch函数演示如何做到这一点:

        fetch(yourUrlForTheControllerAction,
            {
                method: 'post',
                body: JSON.stringify(getViewModel()),
                headers: {
                    'content-type': 'application/json; charset=UTF-8'
                }
            })

然后是blammo,您应该很好。我排除了动态添加迷你表单字段的部分,因为听起来您已经有了解决方案。

答案 2 :(得分:0)

听起来很像,就像您想将model的多个实例提交回控制器一样。

您可以执行以下操作。我的示例将向您的控制器提交10个Field实例。

查看:

@using (Html.BeginForm())
{
    <div>
    @for(int i = 0; i<10; i++) 
    {
        <div>@Html.TextBox("items[" + i + "].Field", "", new { id = "items[" + i + "].Field", placeholder = "Enter Text..." })</div>
        @Html.Hidden("items.Index", i)
    }
    </div>
    <input type="submit" value="Submit" />
}

班级

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

控制器方法:

[HttpPost]
public ActionResult ActionName(List<MyClass> items)
{
   //...do stuff
}

显然,您也可以将复选框添加到模型和表单中,以便提交其中的许多内容。