如何为每个单选按钮保留不同的名称

时间:2012-11-28 13:31:14

标签: asp.net-mvc-3 razor entity-framework-4.1 radiobuttonfor

我有一个MVC3互联网应用程序。

基本上它有一个注册表格,上面有3个单选按钮。每当我选中其中一个单选按钮并点击submit按钮时,它应该转到控制器并将数据插入我的数据库。

我还对Registration表单中的字段进行了验证。

stackoverflow 的某处,我已经阅读了Property names in the Model and the Names of the fields in the view have to be matched,以便在验证错误后保留表单中的值。

此语句适用于TextBoxes和Dropdownlists。

我的问题是:如何使用foreach radiobutton这个独特的名称?

正如我所说,我的表格有3个单选按钮。

说,这些是TextBox,后跟单选按钮

Phone 1 // here is the radio button1
Phone 2 // here is the radio button2
Phone 3 // here is the radio button3

在我的模特中我

public string Phone1 { get; set; }
public string Phone2 { get; set; }
public string Phone3 { get; set; }
//also i have a preferred phone--which sets if any of the phone is selected
public bool PreferredPhone { get; set; }

我尝试过这样的事情

Phone1:
@Html.RadioButtonFor(model => model.PreferredPhone, Model.Phone1, new { id = "Phone1", @onclick = "PrefferedPhone(this)" })
Phone2:
@Html.RadioButtonFor(model => model.PreferredPhone, Model.Phone2, new { id = "Phone2", @onclick = "PrefferedPhone(this)" })
Phone3:
@Html.RadioButtonFor(model => model.PreferredPhone, Model.Phone3, new { id = "Phone3", @onclick = "PrefferedPhone(this)" })

但是此声明将所有单选按钮的名称设置为PreferredPhone

如何为每个单选按钮设置不同的名称?

即使我尝试将RadioButton名称保持为model=>model.Phone1model=>model.Phone2model=>model.Phone3,但如果我这样设置,我可以选择所有三个单选按钮。

1 个答案:

答案 0 :(得分:0)

当你谈到选择所有三个单选按钮时,听起来就像你在谈论它们,好像它们是复选框一样。在同一组中考虑的单选按钮不能同时被选中,每组只选择一个(但也许你已经知道并且我误解了)。

从Stackoverflow中的某处读取的内容是正确的,必须匹配模型中的属性名称和视图中字段的名称。例如,如果你在这样的视图中有radiobuttons:

@Html.RadioButton("stuffRadio", 1)
@Html.RadioButton("stuffRadio", 2)
@Html.RadioButton("stuffRadio", 3)
@Html.RadioButton("stuffRadio", 4)

然后在表单发布时在控制器中:

[HttpPost]
public ActionResult TheAction(Model model, string stuffRadio)
{
    //dostuff to model and other things
    string value = stuffRadio;
    //dostuff to the selected radioStuff :)
}

无论如何,如果我误解了,那么我想问你回报。你说你想要区分每个单选按钮,我不太清楚为什么。是这样你可以获得后期动作和控制器中的所有电话号码吗?

使用我自己的例子我会做这样的事情:

@Html.RadioButton("stuffRadioGroup1", 1)
@Html.RadioButton("stuffRadioGroup2", 2)
@Html.RadioButton("stuffRadioGroup3", 3)
@Html.RadioButton("stuffRadioGroup4", 4)

但是如果我想要阅读所有thos组选择,我当然必须对控制器中的参数执行相同的操作,如下所示:

[HttpPost]
public ActionResult TheAction(Model model, 
    string stuffRadioGroup1, string stuffRadioGroup2, 
    string stuffRadioGroup3, string stuffRadioGroup4)
{
    //dostuff to model and other things
    string value1 = stuffRadioGroup1;
    string value2 = stuffRadioGroup2;
    string value3 = stuffRadioGroup3;
    string value4 = stuffRadioGroup4;
    //dostuff to the selected radioStuff :)
}

再一次,我可能会误解,然后你当然会纠正我;) 后来!

########## EDITED ###################

首先,如果要提交隐藏字段,则必须在表单内,并且必须将该特定隐藏字段的名称作为参数传递到具有相同名称的控制器中。例如:

@(Html.BeginForm("SomeAction", "Controller")
{
    <input type="hidden" name="derp" value="1234" />
    @Html.RadioButtonFor(model => model.PreferredPhone, Model.Phone3, new { id = "Phone3", @onclick = "PrefferedPhone(this)" })
    <button type="submit">submit</button>
}

如果该隐藏字段也应该通过,控制器应该是这样的:

[HttpPost]
public ActionResult SomeAction(Model mymodel, string derp, FormCollection collection)
{
    int number = Convert.toInt32(derp);
    //now number should be '1234'

    string phone3 = collection.Get("Phone3"); 
    //now you have the phone number and the hidden field telling you if that number is preffered

    TryUpdateModel(mymodel); //populate the model if it hasn´t already been populated

    if(ModelState.IsValid)
    {
        //do stuff
    else
    {
        //TODO: here you should set the model with the stuff from derp and collection before returning
        return View("SameViewAsBefore", mymodel);
    }
}

正如您所看到的,我将FormCollection放在那里,只是为了采用不同的方法。希望这有帮助,如果没有,你可以随时再问:) (我知道有时会误解事物)