1

これは簡単なはずですが、ここで説明します。MVC4を使用して、MVC4で厳密に型指定されたビューを介して、メタデータとともにバイナリをアップロードするマルチパートフォームリクエストを処理しています。

フィールドの1つは、ファイルのバージョン番号です(つまり、0.0.6、0.4.5 - preなど)。

このバージョン番号フィールドをモデルフィールド(文字列型)にバインドしようとすると、モデルバインダーから次のエラーが発生します。

{"タイプ'System.String'からタイプ'Models.NewFileVersion'へのパラメーター変換は、タイプコンバーターがこれらのタイプ間で変換できないため失敗しました。"}

具体的には、エラーは「VersionNumber」フィールドまで追跡できます。これが発生する理由について何か考えはありますか?

編集:以下のソースコード

NewFileVersion.cs

public class NewFileVersion
{
    [Display(Name = "Version # (0.67, 0.66-pre, etc...)")]
    [Required]
    public string Version { get; set; }

    [Required]
    [StringLength(2000, ErrorMessage = "ChangeLog must be between 30 an 2000 characters", MinimumLength = 30)]
    [Display(Name = "Version Notes (will be visible to end-users)")]
    [DataType(DataType.MultilineText)]
    public string ChangeLog { get; set; }

    [Display(Name = "Target Platform")]
    [UIHint("Enum")]
    public FileType PlatformTarget { get; set; }
}

New.cshtml

    @model ViewModels.NewFileVersion
@{
    ViewBag.Title = "New";
}
<div class="container" id="main-content">
    <div class="row">
        <h2>
            New</h2>
        @using (Html.BeginForm("Create", "Files", FormMethod.Post, new { enctype = "multipart/form-data" }))
        {
            @Html.ValidationSummary(true)

            <fieldset>
                <legend>NewFileVersion</legend>
                <div class="editor-label">
                    @Html.LabelFor(model => model.Version)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.Version)
                    @Html.ValidationMessageFor(model => model.Version)
                </div>
                <div class="editor-label">
                    @Html.LabelFor(model => model.ChangeLog)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.ChangeLog)
                    @Html.ValidationMessageFor(model => model.ChangeLog)
                </div>
                <div class="editor-label">
                    @Html.LabelFor(model => model.PlatformTarget)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.PlatformTarget)
                </div>
                <div class="editor-label">
                    <label for="">
                        File:</label></div>
                <div class="editor-field">
                    <input type="file" name="fileData" required="required" /></div>
                <p>
                    <input type="submit" value="Upload File" />
                </p>
            </fieldset>
        }
        <div>
            @Html.ActionLink("Back to List", "Index")
        </div>
    </div>
</div>

FilesController.cs

 [HttpPost]
    public ActionResult Create(NewFileVersion version, HttpPostedFileBase fileData)
    {
        //if our model is valid
        if(ModelState.IsValid)
        {
            //etc....             
        }

        ModelState.AddModelError("", "Invalid file submission");

        return View("New", version);
    }
4

1 に答える 1

1

versionアクションのパラメーターの名前を変更してみてくださいCreate。例:

public ActionResult Create(NewFileVersion fileVersion, HttpPostedFileBase fileData) { ... }

string versionモデルバインダーは、モデルプロパティとNewFileVersion versionアクションパラメーターの間で混乱している可能性があります。


BindModelモデルには、複雑なタイプ/モデルではなく単純なタイプ/モデルとしてバインドしようとするアクションパラメーターの名前と完全に一致するプロパティがあるため、これがメソッドで発生する理由がわかります。

于 2012-04-07T18:10:25.667 に答える