1

連絡先を追加するフォームがあります。そのフォームで、名前、住所、会社名などの他の情報とともに連絡先の画像をアップロードしたいのですが、その画像を追加して画像情報をデータベースに保存するにはどうすればよいですか。これが私のhtmlフォームであり、これによると、コントローラーは何になるでしょうか..

@using (Html.BeginForm("", "", FormMethod.Post, new { id = "saveContact", enctype = "multipart/form-data" }))
{
<div class="rowElem noborder">
                <label>
                    First name :</label><div class="formRight"><input type="text" id="firstName" name="firstName" value ="@Model.FirstName" style="width: 600px; height:25px;font-size: 16px;" /></div>
                <div class="fix">
                </div>
</div>
<div class="rowElem">
                <label>
                    Upload Image :</label><div class="formRight"><input type="file" id="imageUpload" name="imageUpload" /></div>
                <div class="fix">
                </div>
            </div>
<input type="submit" id="btnAddContact" value="Save" />
4

1 に答える 1

4

フォームの入力フィールドを模倣するビューモデルを定義することから始めることができます。

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)
{
    ...
}
于 2012-09-24T09:02:48.147 に答える