Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Asp.net MVC-模型绑定仅适用于基本值_C#_Asp.net Mvc - Fatal编程技术网

C# Asp.net MVC-模型绑定仅适用于基本值

C# Asp.net MVC-模型绑定仅适用于基本值,c#,asp.net-mvc,C#,Asp.net Mvc,我正在构建一个web应用程序,将表单中的数据存储在数据库中。我最初的方法是创建一个自定义模型/类,并将POST数据绑定到它。这是我以前成功使用过的方法。然而,这一次根本不起作用。不管我做了什么,我都无法获取绑定到对象属性(ie model.Title)的值,而只能获取基本值(ie String Title)。在挫折中,我最终决定将数据绑定到原语 然而,虽然大多数数据现在都已正确绑定,但我遇到了另一个困难—数据没有绑定到HttpPostedFileBase对象。起初,我认为我的自定义类可能有问题。

我正在构建一个web应用程序,将表单中的数据存储在数据库中。我最初的方法是创建一个自定义模型/类,并将POST数据绑定到它。这是我以前成功使用过的方法。然而,这一次根本不起作用。不管我做了什么,我都无法获取绑定到对象属性(ie model.Title)的值,而只能获取基本值(ie String Title)。在挫折中,我最终决定将数据绑定到原语

然而,虽然大多数数据现在都已正确绑定,但我遇到了另一个困难—数据没有绑定到HttpPostedFileBase对象。起初,我认为我的自定义类可能有问题。情况似乎不再如此,相反,模型绑定器似乎不再能够正确绑定到任何对象,仅绑定到基本体

我的看法

@model StoryWall.ViewModels.AddStoryViewModel
@{
    ViewBag.Title = "Add New Story";
}



<form  method="post" enctype="multipart/form-data" name="addStoryForm" action="Add/SubmitStory" novalidate class="form-horizontal">
    @Html.AntiForgeryToken()


    <div class="form-group"><label class="control-label col-sm-2">Story Title</label><div class="col-sm-10"><input type='text' class="form-control" ng-model="Title" name="PostTitle" required /> <span class="text-danger" ng-show="addStoryForm.model.PostTitle.$touched && addStoryForm.model.PostTitle.$invalid">Title is required.</span></div></div>

    <div class="form-group"><label class="control-label col-sm-2">Story</label><div class="col-sm-10"><textarea class="form-control" ng-model="Body" name="PostBody" required> </textarea> <span class="text-danger" ng-show="addStoryForm.PostBody.$touched && addStoryForm.PostBody.$invalid">Field is required.</span></div></div>



    <div class="form-group"><label class="control-label col-sm-2">Store / Location </label><div class="col-sm-10"><select name="StoreID" class="form-control" ng-model="Store" required > <option value="">Select...</option> 
        @foreach (var store in @Model.stores)
        {
            <option value="@store.StoreID">@store.StoreName</option>
        }
        </select>
         <span class="text-danger" ng-show="addStoryForm.StoreID.$touched && addStoryForm.StoreID.$invalid">Please select a store.</span></div></div>

    <div class="form-group"><label class="control-label col-sm-2">Add a picture (optional)</label><div class="col-sm-10"><input type="file" class="form-control" name="StoryImg"></div></div>

    <div class="form-group"><label class="control-label col-sm-2">Your name</label><div class="col-sm-10"><input type='text' class="form-control" ng-model="Author" name="AuthorName" required /> <span class="text-danger" ng-show="addStoryForm.AuthorName.$touched && addStoryForm.AuthorName.$invalid">Please enter your name.</span></div></div>

    <div class="form-group"><label class="control-label col-sm-2">Your email</label><div class="col-sm-10"><input type='email' class="form-control" ng-model="Email" name="AuthorEmail" required /> <span class="text-danger" ng-show="addStoryForm.AuthorEmail.$dirty && addStoryForm.AuthorEmail.$invalid">Please enter your email.</span></div></div>


    <div ng-controller="TagsCtrl" class="form-group">
        <label class="control-label col-sm-2">Tags (separate with a comma) {{tags.text}}</label>
        <tags-input on-tag-added="updateInput()" ng-model="tags"></tags-input>

            <div class="col-sm-10"><input type='text' class="form-control" ng-model="input.currText" id="tags" name="TagText" /> </div>

    </div>

    <button type="submit" class="btn btn-primary" ng-disabled="addStoryForm.$invalid">Submit</button>
</form>
@model StoryWall.ViewModels.AddStoryViewModel
@{
ViewBag.Title=“添加新故事”;
}
@Html.AntiForgeryToken()
故事标题是必需的。
故事字段是必需的。
存储/位置选择。。。
@foreach(var store in@Model.stores)
{
@store.StoreName
}
请选择一家商店。
添加图片(可选)
您的名字请输入您的名字。
您的电子邮件请输入您的电子邮件。
标记(用逗号分隔){{Tags.text}
提交
负责生成上述视图并接受POST数据的控制器:

  public class AddController : Controller
{

    StoryModel dbContext = new StoryModel();

    public ActionResult Index()
    {
      AddStoryViewModel vm = new AddStoryViewModel();
        vm.stores = dbContext.Stores.OrderBy(s => s.StoreName).ToList();

        return View("Index", vm);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult SubmitStory(String TagText, String PostBody, String PostTitle, int StoreID, String AuthorEmail, String AuthorName, HttpPostedFile StoryImg) 
    {

            Story newStory = new Story();

            // Create new tag if necessary
            String[] tags = TagText.Split(',');

            if (tags.Length > 0) {
                for (int i = 0; i < tags.Length; i++)
                {
                    String tagText = tags[i].ToLower();
                    Tag tag = dbContext.Tags.FirstOrDefault(t => t.TagName.ToLower() == tagText);
                    if (tag != null)
                    {
                        newStory.Tags.Add(tag);
                    }
                    else
                    {
                        Tag newTag = new Tag();
                        newTag.TagName = tags[i].ToLower();
                        dbContext.Tags.Add(newTag);
                        dbContext.SaveChanges();
                        newStory.Tags.Add(tag);

                    }
                }
            }

            newStory.StoryBody = PostBody;
            newStory.DatePosted = DateTime.Now;
            newStory.PosterEmail = AuthorEmail;
            newStory.PosterName = AuthorName;
            newStory.Title = PostTitle;
            newStory.StoreID = StoreID;

            // upload image if uploaded

            if (StoryImg != null)
            {
                String fileName = String.Format("{0}.jpg", new Guid());
                StoryImg.SaveAs(Server.MapPath("~/img/") + fileName);
                newStory.StoryImage = fileName;         
            }
            dbContext.Stories.Add(newStory);
            dbContext.SaveChanges();
            return RedirectToAction("Success", new { storyID = newStory.StoryID });

    }

    public ActionResult Success(Int32 storyID)
    {
        SuccessViewModel vm = new SuccessViewModel();
        vm.newStoryID = storyID;

        return View(vm);

    }
}
公共类AddController:Controller
{
StoryModel dbContext=新的StoryModel();
公共行动结果索引()
{
AddStoryViewModel vm=新的AddStoryViewModel();
vm.stores=dbContext.stores.OrderBy(s=>s.StoreName.ToList();
返回视图(“索引”,vm);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult提交目录(String TagText、String PostBody、String PostTitle、int StoreID、String AuthorEmail、String AuthorName、HttpPostedFile StoryImg)
{
Story newStory=新故事();
//如有必要,创建新标记
String[]tags=TagText.Split(',');
如果(tags.Length>0){
for(int i=0;it.TagName.ToLower()==tagText);
如果(标记!=null)
{
newStory.Tags.Add(tag);
}
其他的
{
标签newTag=新标签();
newTag.TagName=tags[i].ToLower();
dbContext.Tags.Add(newTag);
dbContext.SaveChanges();
newStory.Tags.Add(tag);
}
}
}
newStory.StoryBody=PostBody;
newStory.DatePosted=DateTime.Now;
newStory.PosterEmail=AuthorEmail;
newStory.PosterName=AuthorName;
newStory.Title=PostTitle;
newStory.StoreID=StoreID;
//上载图像(如果已上载)
if(StoryImg!=null)
{
字符串文件名=String.Format(“{0}.jpg”,新Guid());
StoryImg.SaveAs(Server.MapPath(“~/img/”)+文件名);
newStory.StoryImage=文件名;
}
dbContext.Stories.Add(newStory);
dbContext.SaveChanges();
返回RedirectToAction(“Success”,new{storyID=newStory.storyID});
}
公共操作结果成功(Int32 storyID)
{
SuccessViewModel vm=新的SuccessViewModel();
vm.newStoryID=故事ID;
返回视图(vm);
}
}
}

唯一的非原语StoryImg不会绑定-它始终为null


非常感谢您的帮助。

您是否尝试使用HttpPostedFileBase而不是HttpPostedFile?

尝试使用
HttpPostedFileBase
作为
HttpPost
请求中的控制器输入参数,并结合
EditorFor
作为表单中的文件容器,如下例所示:

控制器

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SubmitStory(AddStoryViewModel model, HttpPostedFileBase StoryImg) 
{
     // other stuff

     if (StoryImg != null)
     {
         String fileName = String.Format("{0}.jpg", new Guid());
         StoryImg.SaveAs(Server.MapPath("~/img/") + fileName);
         newStory.StoryImage = fileName;         
     }

     // other code to add story data into DB

     return RedirectToAction("Success", new { storyID = newStory.StoryID });
}
查看

@model StoryWall.ViewModels.AddStoryViewModel

@using (Html.BeginForm("SubmitStory", "Add", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()

    <!-- other stuff -->

    <div class="form-group">
       <label class="control-label col-sm-2">Add a picture (optional)</label>
       <div class="col-sm-10">
       @Html.EditorFor(model => model.StoryImage, new { htmlAttributes = new { @class = "form-control", @type="file" }})
       </div>
    </div>

    <!-- other stuff -->
}

注意:
HttpPostedFile
是一个
密封的
类,与
抽象
HttpPostedFileBase
相比,它的处理方式有所不同,甚至它们内部的属性和方法名称也有一些相似之处。

您应该对此进行扩展,以解释为什么这会解决它们的答案,并举例说明如何使用。谢谢!。我现在觉得很傻。这就是问题的症结所在。简单地切换类实际上是我使用的方法,但我认为将更详细的答案标记为已接受可能是合适的(因为其他人可能会引用本文)。
foreach (String name in Request.Files)
{
    StoryImg = this.Request.Files[name];
}