我是MCV的新手,我正在学习MVC3。我创建了一个模型和一个控制器,并为我生成了视图。生成的代码对我来说非常有意义。我想修改生成的视图和控制器,以便在“创建”新记录时上传文件。关于如何做到这一点有很多很好的信息。具体来说,我试过这个:http://haacked.com/archive/2010/07/16/uploading-files-with-aspnetmvc.aspx
问题是,即使我选择文件(不大)并提交,请求中也没有文件。也就是说,Request.Files.Count是0。
如果我创建控制器并从头开始查看,在同一个项目中(没有模型),该示例工作得很好。我只是无法将该功能添加到生成的页面。基本上,我正在尝试让Create操作也发送文件。例如,创建一个新的产品条目并用它发送图片。
示例创建视图:
@model Product.Models.Find
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm("Create", "Find", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Find</legend>
<input type="file" id="file" />
<div class="editor-label">
@Html.LabelFor(model => model.Title)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Title)
@Html.ValidationMessageFor(model => model.Title)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Description)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Description)
@Html.ValidationMessageFor(model => model.Description)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
示例控制器:
[HttpPost]
public ActionResult Create(Product product)
{
if (ModelState.IsValid)
{
if (Request.Files.Count > 0 && Request.Files[0] != null)
{
//Not getting here
}
db.Products.Add(product);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(find);
}
这将创建记录,但没有与请求关联的文件。
我也试过这样的控制器动作:
[HttpPost]
public ActionResult Create(HttpPostedFileBase file)
{
if (file.ContentLength > 0)
{
//Not getting here
}
return RedirectToAction("Index");
}
我想知道您是否可以在发布表单字段的同时发布文件?如果是这种情况,有哪些模式可用于创建新记录并将图片(或其他文件)与其关联?
由于
答案 0 :(得分:1)
您必须为Product
(可能是ProductViewModel
)创建一个ViewModel,并添加一个与表单字段同名的HttpPostedFileBase
字段,并使用该字段代替{ {1}}在控制器的动作中。
ViewModel只是用于特定视图的模型。大多数情况下,使用额外的数据来生成视图或在控制器操作上分解和形成模型。
Product
答案 1 :(得分:1)
创建一个ViewModel,它具有处理图像和Product deatils
的属性public class ProductViewModel
{
public string ImageURL { set;get;}
public string Title { set;get;}
public string Description { set;get;}
}
在HTTPGET Action方法中,将此ViewModel对象返回到强类型视图
public ActionResult Create()
{
ProductViewModel objVM = new ProductViewModel();
return View(objVM);
}
在你的视图中
@model ProductViewModel
<h2>Add Product</h2>
@using (Html.BeginForm("Create", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.TextBoxFor(m => m.Title) <br/>
@Html.TextBoxFor(m => m.Description ) <br/>
<input type="file" name="file" />
<input type="submit" value="Upload" />
@Html.HiddenFor(m => m.ImageURL )
}
现在在您的HttpPost操作方法中,接受此ViewModel和File
[HttpPost]
public ActionResult Create(HttpPostedFileBase file, ProductViewModel objVM)
{
if(file==null)
{
return View("Create",objVM);
}
else
{
//You can check ModeState.IsValid if you have to check any model validations and do further processing with the data here.
//Now you have everything here in your parameters, you can access those and save
}
}