[英]upload with mvc form
I have a simple question. 我有一个简单的问题。 Why in code below, this part -
HttpPostedFileBase file
- is null? 为什么在下面的代码中,该部分
HttpPostedFileBase file
-为空? Of course ArticleModel model
is not null, just file
. 当然
ArticleModel model
不是null,而只是file
。
Begin of my controler action: 我的控制器动作开始:
public ActionResult Add(ArticleModel model, HttpPostedFileBase file)
...
My form: 我的表格:
<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>
EDIT: 编辑:
my model 我的模特
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; }
}
I have a simple question.
我有一个简单的问题。 Why in code below, this part - HttpPostedFileBase file - is null?
为什么在下面的代码中,该部分-HttpPostedFileBase文件-为空?
Because you didn't set the enctype
to multipart/form-data
on your form: 因为您没有在
multipart/form-data
上将enctype
设置为multipart/form-data
,所以:
@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
...
}
Reference: http://haacked.com/archive/2010/07/16/uploading-files-with-aspnetmvc.aspx 参考: http : //haacked.com/archive/2010/07/16/uploading-files-with-aspnetmvc.aspx
And before you switch your Html.BeginForm
to an Ajax.BeginForm
and then ask a question why HttpPostedFileBase file - is null
, the answer is you cannot upload files using AJAX. 在将
Html.BeginForm
切换到Ajax.BeginForm
并询问为什么HttpPostedFileBase file - is null
,答案是您不能使用AJAX上传文件。 You will have to use a file upload plugin such as Uploadify or Blueimp File upload. 您将必须使用文件上传插件,例如Uploadify或Blueimp File upload。 I am just mentioning this for the record in order to avoid further possible duplicate questions.
我只是在记录中提及此内容,以避免进一步的重复问题。
UPDATE: 更新:
As requested in the comments section you could add the file field to your view model: 根据注释部分的要求,您可以将文件字段添加到视图模型中:
public class ArticleModel
{
[Required]
public HttpPostedFileBase File { get; set; }
...
}
and then have your controller action directly take this view model as argument and get rid of the HttpPostedFileBase argument: 然后让您的控制器操作直接将此视图模型用作参数并摆脱HttpPostedFileBase参数:
public ActionResult Add(ArticleModel model)
{
if (ModelState.IsValid)
{
... work with model.File directly here
}
}
Also to avoid any ambiguity between your domain models and view models, I would suffix them with ViewModel: 另外,为了避免您的域模型和视图模型之间有任何歧义,我将在它们后面加上ViewModel:
public class ArticleViewModel
{
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.