Asp.net mvc 4 如何在另一实体的创建操作中检索已发布的文件

Asp.net mvc 4 如何在另一实体的创建操作中检索已发布的文件,asp.net-mvc-4,razor,Asp.net Mvc 4,Razor,我遇到了与实体相关的已发布文件的问题,我可以在请求中看到已发布的文件,但是如果我添加httppostedfile作为操作参数,它将为null。。。我该如何处理此案例 新闻文章模型: public class NewsArticle { public string Title{get; set;} public int ID{get; set;} [AllowHtml] public string Body { get; set; } public

我遇到了与实体相关的已发布文件的问题,我可以在请求中看到已发布的文件,但是如果我添加httppostedfile作为操作参数,它将为null。。。我该如何处理此案例

新闻文章模型:

public class NewsArticle
  {
    public string Title{get; set;}

    public int ID{get; set;}

    [AllowHtml]
    public string Body { get; set; }

    public Image Image { get; set; }

    //other stuff

  }
[Authorize]
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "ID,Title,Body,SubTitle,Published,Image")]NewsArticle newsArticle )// here I don't know how to manage the posted file
    {
      if (ModelState.IsValid)
      {
        newsArticle.Date = DateTime.Now;
        newsArticle.AuthorID = User.Identity.GetUserId();
        newsArticle.Body = newsArticle.Body;
        _repository.Add(newsArticle);
        return RedirectToAction("Index");
      }

      return View(newsArticle);
    }
字段图像所在的位置:

public class NewsArticle
  {
    public string Title{get; set;}

    public int ID{get; set;}

    [AllowHtml]
    public string Body { get; set; }

    public Image Image { get; set; }

    //other stuff

  }
[Authorize]
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "ID,Title,Body,SubTitle,Published,Image")]NewsArticle newsArticle )// here I don't know how to manage the posted file
    {
      if (ModelState.IsValid)
      {
        newsArticle.Date = DateTime.Now;
        newsArticle.AuthorID = User.Identity.GetUserId();
        newsArticle.Body = newsArticle.Body;
        _repository.Add(newsArticle);
        return RedirectToAction("Index");
      }

      return View(newsArticle);
    }
相关实体将在newarticlecontroller中创建

视图细节

    @model GatorsWebSite.NewsArticle

@{
  ViewBag.Title = "Create";
}

<h2>Create</h2>


@using (Html.BeginForm("Create", "NewsArticles", FormMethod.Post, new { enctype = "multipart/forma-data" }))
{
  @Html.AntiForgeryToken()

  <div class="form-horizontal">
    <h4>NewsArticle</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
      @Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" })
      <div class="col-md-10">
        @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
      </div>
    </div>

    <div class="form-group">
      @Html.LabelFor(model => model.Body, htmlAttributes: new { @class = "control-label col-md-2" })
      <div class="col-md-10">
        @Html.TextAreaFor(model => model.Body, new { htmlAttributes = new { @class = "form-control ckHolder" } })
        @Html.ValidationMessageFor(model => model.Body, "", new { @class = "text-danger" })
      </div>
    </div>

    <div class="form-group">
      @Html.LabelFor(model => model.SubTitle, htmlAttributes: new { @class = "control-label col-md-2" })
      <div class="col-md-10">
        @Html.EditorFor(model => model.SubTitle, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.SubTitle, "", new { @class = "text-danger" })
      </div>
    </div>


    <div class="form-group">
      @Html.LabelFor(model => model.Image, htmlAttributes: new { @class = "control-label col-md-2" })
      <div class="col-md-10">
        @Html.TextBoxFor(m => m.Image, new { type = "file" })
        @Html.ValidationMessageFor(m => m.Image)
      </div>
    </div>


    @*<div class="form-group">
        @Html.LabelFor(model => model.AuthorID, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
          @Html.EditorFor(model => model.AuthorID, new { htmlAttributes = new { @class = "form-control" } })
          @Html.ValidationMessageFor(model => model.AuthorID, "", new { @class = "text-danger" })
        </div>
      </div>*@

    @*<div class="form-group">
        @Html.LabelFor(model => model.Date, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
          @Html.EditorFor(model => model.Date, new { htmlAttributes = new { @class = "form-control" } })
          @Html.ValidationMessageFor(model => model.Date, "", new { @class = "text-danger" })
        </div>
      </div>*@

    <div class="form-group">
      @Html.LabelFor(model => model.Published, htmlAttributes: new { @class = "control-label col-md-2" })
      <div class="col-md-10">
        <div class="checkbox">
          @Html.EditorFor(model => model.Published)
          @Html.ValidationMessageFor(model => model.Published, "", new { @class = "text-danger" })
        </div>
      </div>
    </div>

    <div class="form-group">
      <div class="col-md-offset-2 col-md-10">
        <input type="submit" value="Create" class="btn btn-default" />
      </div>
    </div>
  </div>
}

<div>
  @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {

  @Scripts.Render("~/bundles/jqueryval")
  @Scripts.Render("~/bundles/ckEditor")

  <script type="text/javascript">
    CKEDITOR.replace("@Html.IdFor(m => m.Body)", {});
  </script>
}

非常感谢您的帮助,如果您将输入文件放在表单中,如:

<div class="form-group">
  <label for="newsimage">Select news image:</label>
  <div class="col-md-10">
    <div class="checkbox">
      <input id="newsimage" type="file" name="newsimage"/>
    </div>
  </div>
</div>

选择新闻图像:
行动后将是:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ID,Title,Body,SubTitle,Published,Image")]NewsArticle newsArticle )// here I don't know how to manage the posted file
{
  if (ModelState.IsValid)
  {
    string ImageUrl="";
    for (int i = 0; i < Request.Files.Count; i++)
    {
       if (Request.Files[i].FileName!="")
       {
           string UrlFile = Server.MapPath("~/newsimagefolderpath/") + FileName;
           Request.Files[i].SaveAs(UrlFile);
           ImageUrl = UrlFile;
       }
    }
    newsArticle.Date = DateTime.Now;
    newsArticle.URL = string.IsNullOrEmpty(ImageUrl) ? "defaultimagepath" : ImageUrl;
    newsArticle.AuthorID = User.Identity.GetUserId();
    newsArticle.Body = newsArticle.Body;
    _repository.Add(newsArticle);
    return RedirectToAction("Index");
  }

  return View(newsArticle);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include=“ID,Title,Body,SubTitle,Published,Image”)]newarticle newarticle)//这里我不知道如何管理发布的文件
{
if(ModelState.IsValid)
{
字符串ImageUrl=“”;
对于(int i=0;i
好的,我是MVC的新手,所以很明显我必须纳税,顺便说一句,这就是我为解决这个问题所做的:

我创建了一个ViewModel来承载视图的聚合数据:

public class NewsArticleViewModel
  {
    public string Title { get; set; }

    public int ID { get; set; }

    [AllowHtml]
    public string Body { get; set; }

    public string SubTitle { get; set; }

    public string AuthorID { get; set; }

    public DateTime Date { get; set; }

    public bool Published { get; set; }

    public HttpPostedFileBase ImageUpload { get; set; }
  }
然后我更改了控制操作的签名:

[Authorize]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Title,Body,SubTitle,Published,ImageUpload")]GatorsWebSite.ViewModels.NewsArticleViewModel newsArticle)
然后我纠正了表单声明中的一个拼写错误:)

…然后我改变了看法

@Html.LabelFor(model => model.ImageUpload, htmlAttributes: new { @class = "control-label col-md-2" })
      <div class="col-md-10">
        @Html.TextBoxFor(m => m.ImageUpload, new { type = "file" })
        @Html.ValidationMessageFor(m => m.ImageUpload)
      </div>
@Html.LabelFor(model=>model.ImageUpload,htmlAttributes:new{@class=“control label col-md-2”})
@TextBoxFor(m=>m.ImageUpload,新的{type=“file”})
@Html.ValidationMessageFor(m=>m.ImageUpload)
结果: