1

簡単な質問があります。以下のコードで、なぜこの部分HttpPostedFileBase fileが - - null なのですか? もちろんArticleModel modelnull ではありませんfile

私のコントローラーアクションの始まり:

public ActionResult Add(ArticleModel model, HttpPostedFileBase file)
...

私のフォーム:

<section id="">
@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()
    @ViewBag.Status


    <fieldset>
        <legend>Add</legend>
        <ol>
            <li>
                @Html.LabelFor(m => m.title)
                @Html.TextBoxFor(m => m.title)
            </li>
            <li>
                @Html.LabelFor(m => m.Categories)
                @Html.DropDownListFor(m=> m.categoryID, Model.Categories, "- lorem -", new { @class="dropdownlist" })
            </li>
            <li>
                @Html.LabelFor(m => m.connectedArticlesID)
                @Html.TextBoxFor(m => m.connectedArticlesID)
            </li>
            <li>
                 <input type="file" name="file" id="file" />
            </li>
            <li>
                @Html.LabelFor(m => m.introduction)
                @Html.EditorFor(m => m.introduction)
            </li>
            <li>
                @Html.LabelFor(m => m.content)
                @Html.EditorFor(m => m.content)
            </li>
        </ol>
        <input type="submit" value="Add" />
    </fieldset>
}
</section>

編集:

私のモデル

public class ArticleModel
{
    [Display(Name = "Number")]
    public int articleID { get; set; }

    [Required]
    [Display(Name = "Tilte")]
    [StringLength(250, ErrorMessage = "Tytuł musi mieć długość od {0} do {2} znaków.", MinimumLength = 6)]
    public string title { get; set; }

    [Required]
    [Display(Name = "Similar articles")]
    public string connectedArticlesID { get; set; }

    [Display(Name = "CategoryName")]
    public string category { get; set; }

    [Required]
    [Display(Name = "Category")]
    public int categoryID { get; set; }

    [Required]
    [Display(Name = "Category")]
    public IEnumerable<SelectListItem> Categories
    {
        get
        {
            return new[]
            {
                new SelectListItem { Value = "1", Text = "Kategoria pierwsza" },
                new SelectListItem { Value = "2", Text = "Kategoria druga" },
                new SelectListItem { Value = "3", Text = "Kategoria trzecia" },
            };
        }
    }

    [Display(Name = "Content")]
    [Required]
    [StringLength(6000, ErrorMessage = "Treść musi mieć długość od {1} do {2} znaków.", MinimumLength = 30)]
    [UIHint("tinymce_jquery_full"), AllowHtml]
    public string content { get; set; }

    [Display(Name = "Introduction")]
    [Required]
    [StringLength(6000, ErrorMessage = "Wstęp musi mieć długość od {1} do {2} znaków.", MinimumLength = 30)]
    [DataType(DataType.MultilineText)]
    public string introduction { get; set; }
}
4

1 に答える 1

6

簡単な質問があります。以下のコードで、この部分 (HttpPostedFileBase ファイル) が null になっているのはなぜですか?

enctypeフォームにtoを設定しなかったためmultipart/form-data:

@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" })) 
{
    ...
}

参照: http://haacked.com/archive/2010/07/16/uploading-files-with-aspnetmvc.aspx

を に切り替えて理由を尋ねる前Html.BeginFormAjax.BeginFormHttpPostedFileBase file - is null答えは AJAX を使用してファイルをアップロードできないことです。Uploadify や Blueimp File upload などのファイル アップロード プラグインを使用する必要があります。これ以上重複する可能性のある質問を避けるために、これについて言及しているだけです。


アップデート:

コメント セクションで要求されたように、ファイル フィールドをビュー モデルに追加できます。

public class ArticleModel
{
    [Required]
    public HttpPostedFileBase File { get; set; }

    ...
}

次に、コントローラのアクションでこのビュー モデルを引数として直接取得し、HttpPostedFileBase 引数を取り除きます。

public ActionResult Add(ArticleModel model)
{
    if (ModelState.IsValid)
    {
        ... work with model.File directly here
    }
}

また、ドメイン モデルとビュー モデルの間のあいまいさを避けるために、ViewModel という接尾辞を付けます。

public class ArticleViewModel
{
    ...
}
于 2013-06-17T13:40:27.827 に答える