2013-08-20 3 views
1

를 작동하지 않는 내가 가지고있는 나의 ASP .NET 내부 액션 메소드 만들기 다음 MVC : -Ajax.Beginform + 부분보기 + 모델 상태가 함께

public ActionResult CreateVMNetwork(int vmid) 
     { 
      VMAssignIps vmips = new VMAssignIps() 
      { 
       TechnologyIP = new TechnologyIP() { TechnologyID = vmid}, 
       IsTMSIPUnique = true, 
       IsTMSMACUnique = true 
      }; 
      return PartialView("_CreateVMNetwork",vmips); 
     } 
다음과 같은 부분 뷰를 렌더링

: -

다음과 같은 주요 내부보기
@model TMS.ViewModels.VMAssignIps 

    @using (Ajax.BeginForm("CreateVMNetwork", "VirtualMachine", new AjaxOptions 

    { 
     InsertionMode = InsertionMode.InsertAfter, 
     UpdateTargetId = "networktable", 
     LoadingElementId = "loadingimag", 
     HttpMethod= "POST" 
    })) 
    { 
      @Html.ValidationSummary(true) 
      @Html.HiddenFor(model=>model.TechnologyIP.TechnologyID) 
     <div> 
<span class="f">IP Address</span> 

@Html.EditorFor(model => model.TechnologyIP.IPAddress) 
@Html.ValidationMessageFor(model => model.TechnologyIP.IPAddress)            

    <input type="CheckBox" name="IsTMSIPUnique" value="true" @(Html.Raw(Model.IsTMSMACUnique ? "checked=\"checked\"" : "")) /> | 
<span class="f"> MAC Address</span>  
@Html.EditorFor(model => model.TechnologyIP.MACAddress) 
@Html.ValidationMessageFor(model => model.TechnologyIP.MACAddress)            

<input type="CheckBox" name="IsTMSMACUnique" value="true" @(Html.Raw(Model.IsTMSMACUnique ? "checked=\"checked\"" : "")) /> 

</div> 
      <input type="submit" value="Save" class="btn btn-primary"/> 
    } 

의 Ajax.actionlink 클릭 한 후 : -

@Ajax.ActionLink("Add Network Info", "CreateVMNetwork","VirtualMachine", 
    new { vmid = Model.VirtualMachine.TMSVirtualMachineID }, 
    new AjaxOptions { 
InsertionMode = InsertionMode.Replace, 
UpdateTargetId = "AssignNetwork" , 
LoadingElementId = "progress" 


} 
) 
    </p> 
<p><img src="~/Content/Ajax-loader-bar.gif" class="loadingimage" id="progress" /></p> 
<div id ="AssignNetwork"></div> 

그런 다음 다음과 같은 액션 메소드를 호출 할 것이다 "Save"버튼을 클릭하면 : - :

@model TMS.ViewModels.VMAssignIps 
<tr id="@Model.TechnologyIP.ID"> 
    <td> @Model.TechnologyIP.IPAddress</td> 

    <td>@Model.TechnologyIP.MACAddress</td> 
    <td>@Ajax.ActionLink("Delete", 
"DeleteNetworkInfo", "VirtualMachine", 
new { id = Model.TechnologyIP.ID }, 

new AjaxOptions 
{ Confirm = "Are You sure You want to delete (" + Model.TechnologyIP.IPAddress + ")" + "(" + Model.TechnologyIP.MACAddress + ").", 
    HttpMethod = "Post", 

    OnSuccess = "deletionconfirmation", 
    OnFailure = "deletionerror" 
})</td> 
    </tr> 

위의 모든 잘 작동합니다 -

[HttpPost] 
     public ActionResult CreateVMNetwork(VMAssignIps vmip) 
     { 
if (ModelState.IsValid) 
{ 
try 
{ 
repository.InsertOrUpdateVMIPs(vmip.TechnologyIP,User.Identity.Name); 
repository.Save(); 
return PartialView("_networkrow",vmip); 
} 
catch (Exception ex) 
{ 
ModelState.AddModelError(string.Empty, "Error occurred: " + ex.InnerException.Message); 
}} 
return PartialView("_CreateVMNetwork", vmip); 

} 

이 때이 부분도 다음 _networkrow 렌더링 모델 상태 오류 또는 예외가 발생하지 않으면이 경우 테이블이 부분 뷰로 업데이트되고 모델 상태가 필드가있는 테이블 아래에 표시됩니다. 하지만 동일한 원본보기에 모델 상태 오류를 표시해야합니다. 따라서 예외 나 모델 상태 오류가 발생하지 않는 경우에만 테이블을 업데이트하고 Ajax.begin 폼을 사용하여 테이블 아래가 아니라 원래 부분 뷰 내부에 오류 메시지를 표시해야합니다.

누구든지이 문제를 해결하는 방법에 대한 조언을 구할 수 있습니까?

답변

1

나는 명확하게 질문을 얻지 않지만 오류를 표시하려는 위치에 <div>을 넣어야한다고 생각합니다.

그런 다음 처리 중에 오류가 발생하면 ViewBag을 통해 오류 메시지를 모델로 푸시하십시오.

그래서, 당신의 액션 메소드는 다음과 같이 될 것이다 :

[HttpPost] 
public ActionResult CreateVMNetwork(VMAssignIps vmip) 
{ 
if (ModelState.IsValid) 
{ 
    try 
    { 
     repository.InsertOrUpdateVMIPs(vmip.TechnologyIP,User.Identity.Name); 
     repository.Save(); 
     return PartialView("_networkrow",vmip); 
    } 
    catch (Exception ex) 
    { 
     ViewBag.ErrorMessage = "Some messages..."; 
     // also any other info you like 
    } 
} 

return PartialView("_CreateVMNetwork", vmip); 

} 

그리고 그것을보기에 다음과 같이 :

<div> 
    <p>@ViewBag.ErrorMessage</p> 
</div> 

그래서, 당신이 경우 몇 가지 오류, 그들은 표시됩니다있어 그 안에

+0

답장을 보내 주셔서 감사합니다. 그러나 예외 또는 모델 상태 오류가 발생하는 경우 _CreateVMNetwork보기가 InsertionMode.InsertAfter 테이블이되므로 문제가 발생할 수도 있습니다. 부분 뷰에 오류가 있어도 모든 경우에 Ajax.begin 양식은 부분 뷰를 테이블의 끝에 삽입하기 때문에. 달성하기 위해 노력하고있는 것이 지금은 무엇입니까? –

+0

@ johnG - 이해합니다. 그러나 어떤 코드가 문제인지 알 수 없습니다 ... 문제가없는 코드를 제거하고 Q를 스파 스하려고하십시오. 다음과 같은 것을 찾고 있습니다. 'var isValid =' @ Html.Raw (Json.Encode (ViewData.ModelState.IsValid)) ';'하지만 올바른 장소에 넣는 것을 도와 줄 수는 없습니다 ... – AminSaghi

0

네트워크 테이블은 어디에 정의되어 있습니까? 예외 (사용자가 잡았으므로) 또는 ModelState 오류가 있더라도 ajax 응답은 상태 200으로 돌아가 OnSuccess가 실행된다는 것을 기억하십시오. 저장 버튼의 경우 서버에 반환 된 응답은 이미 포함 된 네트워크 테이블의 html 다음에 삽입됩니다. 실패가있을 때 특별한 조치가 필요하면 서버의 응답 상태를 변경하고 클라이언트 측에서 OnFailure가 호출하는 ajax 양식의 함수를 통해이를 잡아야합니다.

관련 문제