C# POST请求和get集合操作MVC
我似乎无法理解这一点,我相信这是很简单的。 每当我按下“更新/保存”按钮时,我的代码就会转到我的Order类来执行{get;set}。但是,它将MyPhonePrimary字段作为“null”传递,这会导致错误 下面是EditOrder.cshtml页面C# POST请求和get集合操作MVC,c#,asp.net-mvc,http-post,http-get,C#,Asp.net Mvc,Http Post,Http Get,我似乎无法理解这一点,我相信这是很简单的。 每当我按下“更新/保存”按钮时,我的代码就会转到我的Order类来执行{get;set}。但是,它将MyPhonePrimary字段作为“null”传递,这会导致错误 下面是EditOrder.cshtml页面 @using (Html.BeginForm()) { <div class="form-group-PhonePrimary"> <div
@using (Html.BeginForm())
{
<div class="form-group-PhonePrimary">
<div class="input-group" style="border-right:0px">
<span class="input-group-addon" style="text-align: left; border-right: 0px; min-width: 115px">Phone #</span>
@Html.TextBoxFor(model => model.order.PhonePrimary, new { @class = "form-control", @maxlength = "13" })
@Html.ValidationMessageFor(model => model.order.PhonePrimary)
</div>
</div>
<div class="form-group" style="padding-left:5px">
<div class="btnUpdateSave">
<input type="submit" value="Update/Save" class="btn btn-primary col-md-10" />
</div>
</div>
}
public class EditOrderViewModel
{
public Order order { get; set; }
public List<Status> StatusOptions { get; set; }
public IEnumerable<Document> Documents { get; set; }
public IEnumerable<Notary> Notaries { get; set; }
public Notary NotaryAssigned { get; set; }
}
以下是EditOrder.cshtml页面中使用的EditOrderViewModel
@using (Html.BeginForm())
{
<div class="form-group-PhonePrimary">
<div class="input-group" style="border-right:0px">
<span class="input-group-addon" style="text-align: left; border-right: 0px; min-width: 115px">Phone #</span>
@Html.TextBoxFor(model => model.order.PhonePrimary, new { @class = "form-control", @maxlength = "13" })
@Html.ValidationMessageFor(model => model.order.PhonePrimary)
</div>
</div>
<div class="form-group" style="padding-left:5px">
<div class="btnUpdateSave">
<input type="submit" value="Update/Save" class="btn btn-primary col-md-10" />
</div>
</div>
}
public class EditOrderViewModel
{
public Order order { get; set; }
public List<Status> StatusOptions { get; set; }
public IEnumerable<Document> Documents { get; set; }
public IEnumerable<Notary> Notaries { get; set; }
public Notary NotaryAssigned { get; set; }
}
下面是SchedulingREpository.cs中的Order_FindById函数。我正在使用Dapper帮助处理SQL命令
public EditOrderViewModel Order_FindById(int id)
{
var parameters = new DynamicParameters();
parameters.Add("@ID", value: id);
var query = @"long query string that i dont want to put";
using (var multi = this.db.QueryMultiple(query, parameters))
{
EditOrderViewModel editVM = new EditOrderViewModel();
editVM.order = multi.Read<Order>().SingleOrDefault();
editVM.StatusOptions = multi.Read<Status>().ToList();
editVM.Documents = multi.Read<Document>().ToList();
return editVM;
}
}
public EditOrderViewModel Order\u FindById(int-id)
{
var参数=新的DynamicParameters();
参数。添加(“@ID”,值:ID);
var query=@“我不想放入的长查询字符串”;
使用(var multi=this.db.QueryMultiple(查询,参数))
{
EditOrderViewModel editVM=新的EditOrderViewModel();
editVM.order=multi.Read().SingleOrDefault();
editVM.StatusOptions=multi.Read().ToList();
editVM.Documents=multi.Read().ToList();
返回editVM;
}
}
每当我切换到使用
model.order.\u PhonePrimary
而不是当前代码中的(model.order.PhonePrimary
)。我没有收到任何错误,但是我的BeautifyNumber()
从未被触发。在将模型指定给视图之前,请确保实例化Order属性
例如:
public ActionResult EditOrder() {
var vm = new EditOrderViewModel();
vm.Order = new Order();
return View(vm);
}
编辑:在您的回购中尝试以下操作:
editVM.order = multi.Read<Order>().SingleOrDefault() ?? new Order();
editVM.order=multi.Read().SingleOrDefault()??新秩序();
编辑2:可能是模型绑定问题。您可以考虑在POST操作中使用自定义模型绑定器,也可以通过在视图模型中直接引用PhonePrimary并让您的repo负责在POST后将其填充和消化到订单条目中来绕过订单嵌套类的需要 所以,我不确定这是如何解决问题的。但它确实如此(目前…仍在等待更多涉及此问题的错误) 我使用
if (numberToBeautifuy != null)
{
//code
}
else
{
return "";
}
完成的功能如下所示
public static String BeautifyPhoneNumber(string numberToBeautify)
{
if (numberToBeautify != null)
{
//The below gives us capture groups for each
//individual piece of the number.
var regularExpression = new Regex(@"(\d{3})(\d{3})(\d{4})(x\d*)?");
//This matches a number that's already been beautified,
//so we can guard against beautifying twice.
var alreadyBeautifulExpression = new Regex(@"(\(\d{3}\)) (\d{3})-(\d{4}) ?(x\d*)?");
var beautifulNumber = string.Empty;
var separator = "-";
var space = " ";
//This prevents us from accidentally beautifying
//something more than once
//You could also guard against this in your getter using a
//IsBeautified extension, using the alreadyBeautifulExpression above
if (alreadyBeautifulExpression.IsMatch(numberToBeautify))
{
return numberToBeautify;
}
//Trying to protect against invalid input... May be insufficient,
//Or unnecessary
if (string.IsNullOrEmpty(numberToBeautify)
|| regularExpression.Matches(numberToBeautify).Count <= 0)
{
return beautifulNumber;
}
GroupCollection groups = regularExpression.Matches(
numberToBeautify)[0].Groups;
//More protection against invalid input
if (groups.Count <= 3)
{
return beautifulNumber;
}
//Given "7689131234",
beautifulNumber += "(" + groups[1] + ")" + space; //gives us "(768) "
beautifulNumber += groups[2] + separator; //gives us "(768) 913-"
beautifulNumber += groups[3]; //gives us "(768) 913-1234"
//If we have an extension, we add it.
if (groups[4] != null)
{
beautifulNumber += space + groups[4];
}
return beautifulNumber;
}
else
{
return "";
}
}
公共静态字符串美化PhoneNumber(字符串编号美化)
{
if(numberToBeautify!=null)
{
//下面为我们提供了每个组的捕获组
//单件号码。
var regularpression=newregex(@“(\d{3})(\d{3})(\d{4})(x\d*)?”;
//这和一个已经被美化的数字相符,
//因此,我们可以防止美化两次。
var alreadyBeautifulExpression=newregex(@“(\(\d{3})(\d{3})-(\d{4})-(x\d*)?”;
var beautifulNumber=string.Empty;
var分隔符=“-”;
var space=“”;
//这可以防止我们无意中美化
//不止一次
//您还可以在getter中使用
//使用上面的alreadyBeautifulExpression实现了扩展
if(alreadyBeautifulExpression.IsMatch(numberToBeautify))
{
回归数美化;
}
//试图防止无效输入…可能不够,
//或不必要
if(string.IsNullOrEmpty(numberToBeautify)
||regularExpression.Matches(数字美化).Count您是否尝试过运行Fiddler或类似的程序来查看提交回服务器的内容?如果是,它是表单中的null,还是没有填充控制器的操作参数?如果我使用与OP相同的代码,我会在Fiddler-&order上的TextView中得到它。PhonePrimary=%28883%29+332-9302+>但是,在order类中PhonePrimary变量的“PhonePrimary”引发了类型为“System.ArgumentNullException”的异常值=值不能为null。参数名称:inputIs“Order”模型的属性?如果是,您是否在将模型分配给视图之前实例化了Order属性?我将提交一个带有代码的答案,向您说明我的意思。我是,但以另一种方式(使用存储库)。我将控制器代码添加到存储库中的OPE中,您是否允许EF通过外键提供Order属性(导航属性)?我正在使用Dapper来处理我的存储库。(现在将repo代码添加到OP中)非常抱歉;我不知道为什么我假设您正在使用EF。SingleOrDefault是否可能返回null?这是引用类型的默认值。如果为null,您可以尝试返回新订单(请稍后参阅我的编辑).Nope,不是这样。在my Order_FindById()中,editVM.Order返回my_PhonePrimary(看起来像111222333)和my PhonePrimary(看起来像(111)222-3333)的值