型号叫做内另一种模式的结果NULL时表单提交和有效的ModelState [英] Model called inside another model result NULL when form post and modelstate valid

查看:137
本文介绍了型号叫做内另一种模式的结果NULL时表单提交和有效的ModelState的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

t是很奇怪的,一切工作正常,

t is very strange, all works fine,

我展示我在我的表单中的所有文本框,我所有的复选框,但是当我把我的表我在我的控制器遇到错误的第一个我的字符串例如:

i show all my textboxes in my form, all my checkboxes, but when i send my form i got error in my controller on the first of my string example :

creation.Creation.CreationPhotoBis = fileName200;

这是告诉我,creation.Creation.CreationPhotoBis是NULL

It is telling me that creation.Creation.CreationPhotoBis is NULL

堆栈跟踪:

   à HairCollection3.Controllers.CreationController.CreationUpload(CreationHairTagsModel creation, IEnumerable`1 files) dans c:\FRANCESCO\Project\HairCollection3\HairCollection3\Controllers\CreationController.cs:ligne 650
   à lambda_method(Closure , ControllerBase , Object[] )
   à System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   à System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   à System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   à System.Web.Mvc.Async.AsyncControllerActionInvoker.ActionInvocation.InvokeSynchronousActionMethod()
   à System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__36(IAsyncResult asyncResult, ActionInvocation innerInvokeState)
   à System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult)
   à System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
   à System.Web.Mvc.Async.AsyncResultWrapper.End[TResult](IAsyncResult asyncResult, Object tag)
   à System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
   à System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3c()
   à System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass45.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3e()

错误:

{"Object reference not set to an instance of an object."}

InnerEception:创建

InnerEception : Creation

null

其实在我的模型CreationHairTagsModel模式创新是= NULL!为什么?

In fact in my model CreationHairTagsModel the model Creation is = Null!!! why?

whot我需要解决?

whot do i need to fix it?

下面我的模型Creation.cs

Here my model Creation.cs

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace HairCollection3.Models
{
    public class Creation
    {
        public string UserId { get; set; }
        [Key]
        public int CreationId { get; set; }
        public string CreationLanguage { get; set; }

        [Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(ViewRes.ValidationStrings))]
        [Display(Name = "Sex", ResourceType = typeof(ViewRes.Names))]
        public string CreationSex { get; set; }

        [Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(ViewRes.ValidationStrings))]
        [Display(Name = "CreationTitle", ResourceType = typeof(ViewRes.NamesCreation))]
        [StringLength(2000)]
        [AllowHtml]
        public string CreationTitle { get; set; }

        public bool CreationVisible { get; set; }
        public bool CreationDelete { get; set; }
        public DateTime CreationDate { get; set; }
        public string CreationIpAdress { get; set; }

        public string CreationPhotoBis { get; set; }
        public string CreationPhoto750 { get; set; }
        public string CreationPhotoReal { get; set; }

        public string Creationtag { get; set; }

        public virtual ICollection<CreationLike> CreationLikes { get; set; }        

    }

    public class CreationLike
    {
        public int CreationId { get; set; }
        public string UserId { get; set; }
        public virtual ApplicationUser User { get; set; }
        [Key]
        public int CreationLikeId { get; set; }
        public DateTime CreationLikeDate { get; set; }
        public string CreationLikeIpAdress { get; set; }

        public virtual Creation ParentCreation { get; set; }

    }

    public class HairTag
    {
        [Key]
        public int HairTagId { get; set; }

        [Required]
        public string HairTagTitle { get; set; }
        [Required]
        public string HairTagTitleEN { get; set; }
        [Required]
        public string HairTagTitleIT { get; set; }
        [Required]
        public string HairTagTitleSP { get; set; }

        [Required]
        public string HairTagType { get; set; }

        [Required]
        public int HairTagOrder { get; set; }   
    }





    //CHECKBOXES
    public class HairTagModel
    {
        [Key]
        public int Value { get; set; }
        public string Text { get; set; }
        public bool IsChecked { get; set; }
    }

    public class HairTagList
    {
        private ApplicationDbContext creationdb = new ApplicationDbContext();

        public HairTagList()
        {
            var HairTagList = creationdb.HairTags.ToList();

            List<HairTagModel> obj = new List<HairTagModel>();
            foreach (var tags in HairTagList)
            {
                obj.Add(new HairTagModel
                {
                    Text = tags.HairTagTitle,
                    Value = tags.HairTagId,
                    IsChecked = false
                });
            }

            this.CreationHairTags = obj;
        }

        public List<HairTagModel> CreationHairTags { get; set; }

        //public List<HairTagModel> ListHairTags { get; set; }
    }



    public class CreationHairTagsModel
    {
        //public Creation Creation { get; set; }
        //public List<HairTagModel> CreationHairTags { get; set; }

        public Creation Creation { get; set; }

        private ApplicationDbContext creationdb = new ApplicationDbContext();

        public List<HairTagModel> CreationHairTags
        {
            get
            { 
                var HairTagList = creationdb.HairTags.ToList();

                List<HairTagModel> obj = new List<HairTagModel>();

                foreach (var tags in HairTagList)
                {
                    obj.Add(new HairTagModel
                    {
                        Text = tags.HairTagTitle,
                        Value = tags.HairTagId,
                        IsChecked = false
                    });
                }

                return obj;
            }
        }
    }


}

下面我控制器CreationController.cs

Here my controller CreationController.cs

// GET: /Creation/CreationUpload
        [Authorize]
        public ActionResult CreationUpload()
        {
            CreationHairTagsModel creation = new CreationHairTagsModel();

            return View(creation);

            //return View();
        }

        // POST: /Creation/CreationUpload
        // Afin de déjouer les attaques par sur-validation, activez les propriétés spécifiques que vous voulez lier. Pour 
        // plus de détails, voir  http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [Authorize]
        [ValidateAntiForgeryToken]
        public ActionResult CreationUpload([Bind(Include = "CreationId,CreationSex,CreationTitle,CreationPhotoBis,CreationHairTags")] CreationHairTagsModel creation, IEnumerable<HttpPostedFileBase> files)
        {
            if (ModelState.IsValid)
            {                
                // update each field manually
                foreach (var file in files)
                {
                    if (file != null)
                    {
                        if (file.ContentLength > 0)
                        {

                                     ...UPLOAD CODE HIDDEN                           
                                    creation.Creation.CreationPhotoBis = fileName200;


                                //Ipaddress
                                var ipAddress = Request.ServerVariables["REMOTE_ADDR"];

                                //Avoid Script
                                var CreationTitletocheck = Regex.Replace(creation.Creation.CreationTitle, @"<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>", string.Empty);
                                CreationTitletocheck = Regex.Replace(CreationTitletocheck, @"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>", string.Empty);
                                creation.Creation.CreationTitle = CreationTitletocheck;

                                //Tags
                                StringBuilder sb = new StringBuilder();
                                foreach (var item in creation.CreationHairTags)
                                {
                                    if (item.IsChecked)
                                    {
                                        sb.Append(item.Text + ",");
                                    }
                                }
                                creation.Creation.Creationtag = sb.ToString();

                                creation.Creation.UserId = User.Identity.GetUserId();
                                creation.Creation.CreationLanguage = ViewRes.Shared.Langue;
                                creation.Creation.CreationVisible = true;
                                creation.Creation.CreationDelete = false;
                                creation.Creation.CreationDate = DateTime.Now;
                                creation.Creation.CreationIpAdress = ipAddress;
                                creation.Creation.CreationPhotoReal = fileName; //after add

                                db.Creations.Add(creation.Creation);
                                db.SaveChanges();



                            }


                        }
                    }
                }

                //UserId
                return RedirectToAction("CreationList", "Creation", new { UserId = User.Identity.GetUserId() });
            }

            return View(creation);
        }

在这里我的观点:CreationUpload.cshtml

here my view : CreationUpload.cshtml

@model HairCollection3.Models.CreationHairTagsModel
@using Microsoft.AspNet.Identity


@{
    ViewBag.Title = ViewRes.NamesCreation.CreationUploadTitle;
}


<div class="col-sm-12 col-md-12 chpagetop">

    <h1>@ViewRes.Shared.PublishAPhoto</h1>

    <hr />

    @using (Html.BeginForm("CreationUpload", "Creation", FormMethod.Post, new { id = "CreationUpload", enctype = "multipart/form-data", onsubmit = "$('#creationloading').show(); $('#creationform').hide();" }))
    {
        @Html.AntiForgeryToken()


        <div class="col-md-12" id="creationloading" style="display:none">
            <div id="progress">
                <p>@ViewRes.Shared.UploadPhotoProgress<strong>0%</strong></p>
                <progress value="5" min="0" max="100"><span></span></progress>
            </div>
        </div>

        <div class="col-md-12" id="creationform">

            <div class="col-md-12">
                @Html.ValidationMessageFor(m => m.Creation.CreationSex)
                @Html.RadioButtonFor(m => m.Creation.CreationSex, "F", new { @checked = true }) @ViewRes.Shared.WomanHairstyle  @Html.RadioButtonFor(m => m.Creation.CreationSex, "M") @ViewRes.Shared.ManHairstyle
            </div>

            <div class="col-md-12">
                @Html.ValidationMessageFor(m => m.Creation.CreationTitle)
                @Html.TextBoxFor(m => m.Creation.CreationTitle, new { @class = "inputplaceholderviolet wid100x100", placeholder = HttpUtility.HtmlDecode(Html.DisplayNameFor(m => m.Creation.CreationTitle).ToHtmlString()), onfocus = "this.placeholder = ''", onblur = "this.placeholder = '" + HttpUtility.HtmlDecode(Html.DisplayNameFor(m => m.Creation.CreationTitle).ToHtmlString()) + "'" })
            </div>

            <div class="col-md-12">
                @for (int i = 0; i < Model.CreationHairTags.Count; i++)
                {
                    @Html.CheckBoxFor(m => Model.CreationHairTags[i].IsChecked)
                    @Model.CreationHairTags[i].Text
                    @Html.HiddenFor(m => Model.CreationHairTags[i].Value)
                    @Html.HiddenFor(m => Model.CreationHairTags[i].Text)<br />
                }
            </div>

            <div class="col-md-12" style="text-align: center">
                <p style="display: inline-block">
                    <input type="file" accept="image/*" onchange="loadFile(event)" name="files" id="file1" translate="yes" data-val="true" data-val-required="A File is required." class="wid100x100" /><label for="file1"></label>
                    <img id="output" style="max-width:200px;" />
                </p>
            </div>

            <div class="col-sm-12 col-md-12 chpagetopdiv">
                <button type="submit" title="@ViewRes.Shared.Publish"><span class="glyphicon glyphicon-share-alt"></span> @ViewRes.Shared.Publish</button>
            </div>

        </div>

    }


</div>

在我IdentityModels.cs

In my IdentityModels.cs

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Web.Mvc;

namespace HairCollection3.Models
{
    // You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
    public class ApplicationUser : IdentityUser
    {

        // New Fields added to extend Application User class:
        CODE USER HIDDEN

    }

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection")
        {
        }



        public DbSet<Creation> Creations { get; set; }
        public DbSet<CreationLike> CreationLikes { get; set; }
        public DbSet<HairTag> HairTags { get; set; }        

什么是错误的,我code请帮忙解释?

What is wrong in my code please help and explain ?

推荐答案

CreationHairTagsModel 由ModelBinding的创建<实例/ code >属性为null。

When CreationHairTagsModel is instantiated by ModelBinding the Creation property is null.

尝试初始化在 CreationHairTagsModel 构造创建属性,这样,当ModelBinding创建CreationHairTagsModel,创建将不能为null。

Try initializing Creation property in the CreationHairTagsModel constructor so that when ModelBinding creates CreationHairTagsModel, Creation will not be null.

public CreationHairTagsModel()
{
    Creation = new Creation();
}

这篇关于型号叫做内另一种模式的结果NULL时表单提交和有效的ModelState的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆