您可以从定义一个模拟表单输入字段的视图模型开始:
public class ContactViewModel
{
[DisplayName("First name :")]
[Required]
public string FirstName { get; set; }
[DisplayName("Upload Image :")]
[Required]
public HttpPostedFileBase ImageUpload { get; set; }
}
然后让您的控制器操作将此视图模型作为参数:
[HttpPost]
public ActionResult Save(ContactViewModel model)
{
...
}
当然,根据您使用的数据访问技术,可能会有不同的方法将联系人保存到数据库中。例如,如果您使用的是普通的 ADO.NET,则可以使用一种方法进行保存:
public int SaveContact(string firstName, byte[] photo)
{
using (var conn = new SqlConnection("YOUR CONNECTION STRING COMES HERE"))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "INSERT INTO Contacts (FirstName, Photo) VALUES (@firstName, @photo)";
cmd.Parameters.AddWithValue("@firstName", firstName);
cmd.Parameters.Add("@photo", SqlDbType.BigInt, 20).Value = photo;
return cmd.ExecuteNonQuery();
}
}
然后在您的控制器操作中,您可以调用此方法:
[HttpPost]
public ActionResult Save(ContactViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
using (var stream = new MemoryStream())
{
model.ImageUpload.InputStream.CopyTo(stream);
byte[] photo = stream.ToArray();
SaveContact(model.FirstName, photo);
return RedirectToAction("Index");
}
}
另外,我建议您在视图中使用 HTML 助手来生成输入字段,而不是硬编码它们:
@model ContactViewModel
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "saveContact", enctype = "multipart/form-data" }))
{
<div class="rowElem noborder">
@Html.LabelFor(x => x.FirstName)
<div class="formRight">
@Html.TextBoxFor(x => x.FirstName, new { style = "width: 600px; height:25px;font-size: 16px;" })
@Html.ValidationMessageFor(x => x.FirstName)
</div>
<div class="fix"></div>
</div>
<div class="rowElem">
@Html.LabelFor(x => x.UploadImage)
<div class="formRight">
@Html.TextBoxFor(x => x.ImageUpload, new { type = "file" })
@Html.ValidationMessageFor(x => x.ImageUpload)
</div>
<div class="fix"></div>
</div>
<input type="submit" id="btnAddContact" value="Save" />
}
更新:
如果您不想遵循我关于使用视图模型的建议,并且直接将您的域模型传递给视图,并且您没有 ImageUpload 属性并且您无法修改它,您仍然可以拥有以下控制器操作签名:
[HttpPost]
public ActionResult Save(Contact model, HttpPostedFileBase imageUpload)
{
...
}