フォームの入力フィールドを模倣するビューモデルを定義することから始めることができます。
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)
{
...
}