2

私は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");
    }

フォーム フィールドの投稿と同時にファイルを投稿できないのではないでしょうか? その場合、新しいレコードを作成し、それに画像 (またはその他のファイル) を関連付けるパターンにはどのようなものがありますか?

ありがとう

4

2 に答える 2

1

画像と製品の詳細を処理するためのプロパティを持つ ViewModel を作成します

public class ProductViewModel
{
 public string ImageURL { set;get;}
 public string Title { set;get;}
 public string Description { set;get;}
}

HTTPGET アクション メソッドで、この 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
 }        
}
于 2012-04-09T01:26:05.493 に答える
1

Product(おそらく)のViewModelを作成し、フォームのフィールドと同じ名前ProductViewModelのフィールドを追加して、コントローラーのアクションの代わりにそれを使用する必要があります。HttpPostedFileBaseProduct

ViewModel は、特定のビューに使用されるモデルに他なりません。ほとんどの場合、ビューを生成するため、またはコントローラ アクションでモデルを分解して形成するための追加データが必要です。

public ProductViewModel
{
    public string Cod { get; set; }
    // All needed fields goes here

    public HttpPostedFileBase File{ get; set; }

    /// Empty constructor and so on ...
}
于 2012-04-09T01:12:13.163 に答える