簡體   English   中英

在ASP.NET MVC3視圖的for循環中生成具有相同名稱的RadioButtons列表

[英]Generating a list of RadioButtons with the same name in a for-loop in an ASP.NET MVC3 view

我正在開發一個ASP.NET MVC3項目,並且PartialView中的for循環生成的RadioButtons名稱存在問題。
首先,這是我的代碼,下面將解釋確切的問題:

模型FileUploadModel

public class FileUploadModel
{
    public HttpPostedFileBase File { get; set; }

    public bool IsMainFile { get; set; }
}


模特MyModel

public class MyModel
{
    // Some properties

    public List<FileUploadModel> Files { get; set; }
}


如何調用PartialView _UploadFiles

@Html.Partial("_UploadFiles", Model) // Model is a MyModel model


PartialView _UploadFiles-這里是問題

@model MyModel

@{
    var nbFiles = (Model.Files != null ? Model.Files.Count : 0);
    const int NB_DEFAULT_UPLOAD_FIELDS = 3;
}

@for (int i = 0; i < NB_DEFAULT_UPLOAD_FIELDS; i++)
{
    @Html.TextBoxFor(m => m.Files[nbFiles].File, new { type = "file", name = "Files", id = "Files" })
    @Html.RadioButtonFor(m => m.Files[nbFiles].IsMainFile, "Main ?", new { id = "rb" + i + "_File_IsMain" })
}

因此,這是問題的最后片段。 我想用關聯的RadioButton創建3個上傳字段,以指示文件是否為“主文件”。 但是,使用上面的代碼片段,顯示的視圖就可以了,但是當我驗證表單時,我發布的模型僅上傳了第一張圖片(以及相應的布爾值IsMainFile ,其余的則被忽略了)。 這意味着列表Files僅包含第一個TextBox和第一個RadioButton數據

因此,我嘗試使用@Html.RadioButtonFor(m => m.Files[i].IsMainFile ,但是RadioButton的名稱不同,因此用戶可以檢查所有RadioButton,這不是理想的行為@Html.RadioButtonFor(m => m.Files[i].IsMainFile沒有授權我覆蓋RadioButtons的name ,所以我不能給他們自己的名字。

我如何生成這些字段,以便僅可以檢查一個MyModel.Files屬性包含所有選擇的文件?

謝謝

我認為您最好的選擇是使用編輯器模板

首先,創建一個名為FileUploadModel的視圖,並將其放置在一個名為EditorTemplates的文件夾中,該文件夾應位於控制器的Views文件夾下。 請注意,視圖的名稱必須與視圖模型的類的名稱匹配。

其內容如下所示:

@model FileUploadModel

@Html.TextBoxFor(m => m.File, new { type = "file" })
@Html.RadioButtonFor(m => m.IsMainFile, true)

然后,回到"_UploadFiles"視圖,輸入字段和單選按鈕的標記將更改為:

@model MyModel

using (Html.BeginForm(...

    @Html.EditorFor(m => m.Files)

...

請注意,這將自動迭代並為每個FileUploadModel對象應用該編輯器模板,並根據需要自動為其命名。 當然,這假定已填充模型中的Files屬性。

您接受帖子的操作應接受MyModel類型作為其唯一參數,並且所有內容都應在發布時自動綁定。

有一些方法可以避免使用編輯器模板, 並以編程方式構建和命名這些字段 ,但這確實是首選方法,而且更加簡潔。

更具體地針對您的問題... (換句話說,我忘記了上面的代碼不會對單選按鈕進行分組。)

為了使單選按鈕分組有效,應按如下所示設置屬性名稱:

@Html.RadioButtonFor(m => m.IsMainFile, true, new { Name = "IsMainFile" })

案例很重要。 請注意, Name必須大寫才能生效。 我不確定為什么會這樣。

問題在於,一旦更改了該屬性,該字段將不再自動綁定到帖子中。 不幸的是,但這是設計好的,因為如果您查看請求,我相信您會看到僅發布了選定的單選按鈕值。

因此,您可以將單選按鈕的值更改為可識別的值,因為如果我是對的,則只是IsMainFile一個實例將顯示在請求中。

也許您可以使用此特定知識來調整現有代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM