我正在创建mvc4中的应用程序。在编辑模式下,我希望用户编辑他/她的详细信息,用户可以选择从文件加载器中选择更改他的个人资料图像。但如果用户没有在上传器中选择文件,则会发送先前的文件位置。我在表中存储图像路径与其他细节相同。因此,只创建一个存储过程。我在mvc中只有1天。直接开始学习mvc,没有师兄师姐的命令。所以请帮忙
使用强类型模型是一个很好的实践。你应该为你的User创建一个分隔ViewModel:
模型/UserEditViewModel
public int Id { get; set; }
public string Name { get; set; }
// Other properties
public HttpPostedFileBase Photo { get; set; }
控制器:
[HttpGet]
public ActionResult Edit(int id)
{
// Get user from database
var user = db.Users.Find(id);
// Map user to UserEditViewModel
var userVM = new UserEditViewModel
{
Id = user.Id;
Name = user.Name;
// Other mappings
}
return View(userVM);
}
[HttpPost]
public ViewResult Edit(UserEditViewModel model)
{
if (ModelState.IsValid)
{
var existingUser = db.Users.Find(model.Id);
if (model.Photo != null && model.Photo.ContentLength > 0)
{
// Update database and copy image to server
}
}
}
视图:
@model YourProject.Models.UserEditViewModel
@using (Html.BeginForm("Edit", "YourController", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
// Form stuff
@Html.HiddenFor(m => m.Id)
@Html.EditorFor(m => m.Name)
@Html.EditorFor(m => m.Photo) // Creates <input type="file" name="Photo" />
<input type="submit" value="Save" />
}
下面的代码是基于您将文件名保存在db表中并将文件保存在应用服务器上的假设。
代码如下:
模型:
public string Photo {get;set;}
视图:
<input type='file' id='file'/>
@Html.HiddenFor(m=>m.Photo)
JS:
// if there is a photo update by user, change the Photo hidden element value
//get the final name of the photo saved in server
$("#Photo").val(newname);
然后只需张贴您的表单。
如果用户没有更改其照片,则前一个值将保留在隐藏元素中并更新到db。因此,照片列实际上不会发生任何变化。
我强烈推荐这个教程给MVC初学者。