2014-04-09 2 views
2

나는이 것을 파악하지 못하는 것 같아서 간단하다고 생각합니다. "Update/Save"버튼을 누를 때마다 코드는 {get; set}을 수행하기 위해 Order 클래스로 이동합니다. 그러나, 그것은 오류를 일으키는 "null"로 내 PhonePrimary 필드를 전달합니다.POST 요청 및 설정 동작 MVC

다음은 다음은 Order 클래스 인 EditOrder.cshtml 페이지

 @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 Order 
{ 
     private string _PhonePrimary; 
       [DisplayName("Phone Primary")] 
     public string PhonePrimary 
     { 
      get 
      { 
       //this._PhonePrimary = BeautifyPhoneNumber(this._PhonePrimary); 

       return BeautifyPhoneNumber(this._PhonePrimary); 
      } 
      set 
      { 
       this._PhonePrimary = value; 
      } 
     } 
    } 

는 EditOrder.cshtml 페이지에서 사용되고있는 EditOrderViewModel SchedulingController.cs 이하이다 httpget 및 httppost

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; } 
} 

 [HttpGet] 
     public ActionResult EditOrder(int id) 
     { 
      var model = repositoryScheduling.Order_FindById(id);//returns EditOrderViewModel 

      model.NotaryAssigned = repositoryScheduling.Notary_FindAssignedNotary(model.order.Id); 

      return View(model); 
     } 
    [HttpPost] 
     public ActionResult EditOrder(EditOrderViewModel orderModel) 
     { 
      try 
      { 
       repositoryScheduling.Order_Update(orderModel); 
       return RedirectToAction("OrderIndex"); 
      } 
      catch (MySql.Data.MySqlClient.MySqlException ex) 
      { 
       return View(); 
      } 
     } 

여기 Order_FindById 함수 인 SchedulingREpository.cs에 있습니다. 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; 
     } 
    } 

내가 대신 현재의 코드 (model.order.PhonePrimary)에서 하나의 model.order._PhonePrimary를 사용하도록 전환 할 때마다. 오류 메시지는 나타나지 않지만 내 BeautifyNumber()이 실행되지 않습니다.

+0

피들러 (Fiddler) 또는 유사한 것을 실행하여 서버로 다시 전송되는 것을 확인해 보셨습니까? 그렇다면 폼에서 null입니까? 아니면 컨트롤러의 액션 매개 변수를 채우지 못합니까? – Bill

+0

OP와 동일한 코드를 사용하면 Fiddler의 TextView에서이 코드를 얻을 수 있습니다. - & order.PhonePrimary = % 28883 % 29 + 332-9302 +> 그러나 Order 클래스에서 PhonePrimary 변수에 'PhonePrimary'예외가 발생했습니다. 'System.ArgumentNullException'형식의 값 = 값은 null 일 수 없습니다. 매개 변수 이름 : 입력 – MaylorTaylor

+0

"주문"은 모델의 속성입니까? 그렇다면 모델을보기에 할당하기 전에 Order 속성을 인스턴스화하고 있습니까? 내가 의미하는 바를 보여주기 위해 코드로 답을 제출할 것입니다. – Bill

답변

0

보기에 모델을 지정하기 전에 Order 특성을 인스턴스화해야합니다. 예를 들어

:

public ActionResult EditOrder() { 
    var vm = new EditOrderViewModel(); 
    vm.Order = new Order(); 
    return View(vm); 
} 

편집 : 당신의 repo이 시도 :

editVM.order = multi.Read<Order>().SingleOrDefault() ?? new Order(); 

편집 2 : 그것은 모델 바인딩 문제가 될 수 있습니다. POST 액션을 위해 사용자 정의 모델 바인더를 사용할 수도 있고, 뷰 모델에서 PhonePrimary를 직접 참조하고 POST 후에 POST를 주문 항목에 채우고 소화하도록 처리하여 Order 중첩 클래스의 필요성을 우회 할 수도 있습니다 .

+0

나는 다른 방법으로 (저장소 사용). OP – MaylorTaylor

+0

에 컨트롤러 코드를 추가했습니다. 저장소 내에서 EF가 외래 키 (탐색 속성)를 통해 Order 속성을 제공하게 하시겠습니까? – Bill

+0

Dapper를 사용하여 저장소를 처리하고 있습니다. (지금 OP에 repo 코드 추가) – MaylorTaylor

0

그래서이 문제가 어떻게 해결되는지 정확히 모르겠습니다. 그러나이하는

(지금은 ... 아직 나중에^_ ^이 관련된 이상의 오류를 기다리는) 나는 완성 된 기능은 아래에있는

if (numberToBeautifuy != null) 
{ 
//code 
} 
else 
{ 
return ""; 
} 

BeautifyPhoneNumber() 함수 내에서 코드를 캡슐화.

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 ""; 
     } 
    } 

누군가가 내게 왜 이것이 효과가 있는지 설명 할 수 있다면 좋을 것이고 나는 당신에게 '대답'점수를 줄 것입니다.