Asp.net mvc 将表单过帐到控制器后,ViewModel内容为空

Asp.net mvc 将表单过帐到控制器后,ViewModel内容为空,asp.net-mvc,asp.net-mvc-5,nullreferenceexception,asp.net-mvc-viewmodel,Asp.net Mvc,Asp.net Mvc 5,Nullreferenceexception,Asp.net Mvc Viewmodel,因此,ViewModel有两组数据。 当前详细信息和更新的详细信息。这两个类都是同一个类的实例,其中包含字符串等等 此方法适用于我尝试使用的所有其他视图和模型,但对于这一实例,当表单发布到控制器时,发现其内容(CurrentDetails和UpdatedDetails)均为null 我尝试过将参数名从model更改为test和其他任意内容,但没有效果 一件有效的事情(但对我来说不是解决方案)是在ViewModel中没有类的实例,只有数据(但我不明白为什么我必须这样做) 这是控制器: [HttpP

因此,ViewModel有两组数据。 当前详细信息和更新的详细信息。这两个类都是同一个类的实例,其中包含字符串等等

此方法适用于我尝试使用的所有其他视图和模型,但对于这一实例,当表单发布到控制器时,发现其内容(CurrentDetails和UpdatedDetails)均为null

我尝试过将参数名从model更改为test和其他任意内容,但没有效果

一件有效的事情(但对我来说不是解决方案)是在ViewModel中没有类的实例,只有数据(但我不明白为什么我必须这样做)

这是控制器:

[HttpPost]
公共行动结果FloristProfile(MerchantFloristProfileViewModel测试)
{
如果(!ModelState.IsValid)
返回视图(测试);
使用(var db=new ApplicationDbContext())
{
Florist Florist=db.Florists.Find(MerchantBase.FloristID);
if(Request.Form[“editSubmit”]!=null)
{
florist.Name=test.updateDetails.Name;
florist.Website=test.UpdatedDetails.Website;
db.SaveChanges();
返回重定向到操作(“FloritsProfile”);
}
else if(Request.Form[“photoSubmit”]!=null)
{
如果(test.CurrentDetails.File.ContentLength>0)
{
CloudBlobContainer容器=FlowerStorage.GetCloudBlobContainer();
string blobName=string.Format(“florist_{0}.jpg”,Guid.NewGuid().ToString());
CloudBlockBlob photoBlob=container.GetBlockBlobReference(blobName);
UploadFromStream(test.CurrentDetails.File.InputStream);
florist.LogoPath=blobName;
florist.isRendering=正确;
db.SaveChanges();
返回重定向到操作(“FloritsProfile”);
}
}
}
返回内容(“无效请求”);
}
视图:

@使用(Html.BeginForm(“Florisprofile”,“Merchant”,FormMethod.Post,new{@class=“form horizontal”}))
{
@Html.ValidationSummary(false,“,new{@class=“text danger”})
@Html.HiddenFor(x=>x.CurrentDetails.FloristID)
@Html.HiddenFor(x=>x.CurrentDetails.Name)
@Html.HiddenFor(x=>x.CurrentDetails.StaffCount)
@Html.HiddenFor(x=>x.CurrentDetails.StoreCount)
@Html.HiddenFor(x=>x.CurrentDetails.Website)
@LabelFor(x=>x.updateDetails.Name,新的{@class=“col-sm-2控件标签”})
@TextBoxFor(x=>x.updateDetails.Name,新的{@class=“form control”})
@LabelFor(x=>x.updateDetails.Website,新的{@class=“col-sm-2控制标签”})
@TextBoxFor(x=>x.updateDetails.Website,new{@class=“form control”})
拯救
}
视图模型:

公共类MerchantFloritProfileViewModel
{
公共类花店详细信息
{
public int FloristID{get;set;}
[必需(ErrorMessage=“请输入名称”)]
公共字符串名称{get;set;}
[数据类型(DataType.Url)]
[必需(ErrorMessage=“请输入网站”)]
公共字符串网站{get;set;}
public int StoreCount{get;set;}
public int StaffCount{get;set;}
//图片上传
公共HttpPostedFileBase文件{get;set;}
}
公共花店详情;
公共花店详细信息更新详情;
}

您的
MerchantFloritProfileViewModel
模型中的
CurrentDetails
UpdatedDetails
都是字段,而不是属性(没有getter/setter),因此
DefaultModelBinder
不能设置这些值。将它们更改为

public FloristProfileDetails CurrentDetails { get; set; }
public FloristProfileDetails UpdatedDetails { get; set; }

但您不应该将所有额外数据发送到视图,然后将其原封不动地重新发送回去。除了额外的开销外,任何恶意用户都可能更改隐藏字段中的值,从而导致您的应用程序失败。如果您在POST方法中需要原始数据,只需再次从存储库获取原始数据即可您的
MerchantFloritProfileViewModel
模型中的
UpdatedDetails
是字段,而不是属性(没有getter/setter),因此
DefaultModelBinder
无法设置值。将其更改为

public FloristProfileDetails CurrentDetails { get; set; }
public FloristProfileDetails UpdatedDetails { get; set; }

但是你不应该将所有额外的数据发送到视图,然后将其原封不动地发送回去。除了额外的开销外,任何恶意用户都可能更改隐藏字段中的值,从而导致你的应用程序失败。如果你在POST方法中需要原始数据,只需再次从存储库获取即可

非常感谢您的帮助,非常感谢upid!我还将从repo/db中获取最新数据,这样更安全,开销更小,就像你说的那样!非常感谢你的帮助,我真蠢!我还将从repo/db中获取最新数据,这样更安全,开销更小,就像你说的!