2014-08-29 40 views
-1
動作

我想一個userid傳遞給我的控制器。我的動作動作是這樣的,你可以在這裏看到:通模式和額外的參數從視圖到MVC

[HttpPost] 
     [Authorize(Roles = "Admin,Expert")] 
     public ActionResult AddExpert(AssistanceJuror assistanceJuror,int UserId) 
     { 
      User user = objUserRepository.FindBy(i => i.Id == assistanceJuror.UserId).First(); 
      user.Enable = "فعال"; 
      assistanceJuror.Date = DateTime.Now; 
      objUserRepository.Edit(user); 
      objUserRepository.Save(); 
      objAssistanceJurorRepository.Add(assistanceJuror); 
      TempData["Message"] = "کارشناس به معاونت اختصاص داده شد"; 
      objAssistanceJurorRepository.Save(); 
      return RedirectToAction("IndexExpert", "Assistance"); 
     } 

所以這個動作期望2個參數,一個是我的模型,另一個是userId。所以我需要從視圖中獲得這兩個值我的看法是這樣的:

@using ViewModelDomain 
@using Repository; 
@model DomainClass.AssistanceJuror 

@{ 
    ViewBag.Title = "AddExpert"; 
} 

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 
    <div class="wrapper-left"> 
     <div class="wrapper-top-addCompany"> 
      انتساب کارشناس به معاونت 
      <div style="float: left; padding-left: 20px;"> 
       <div class="divider"></div> 
       <div class="buttonPossion"> 
        @Html.ActionLink("بازگشت", "Index", "Assistance", new { companyid = ViewBag.firstIdeaId }, new { @class = "buttonBlueLink" }) 
       </div> 
       <div class="divider"></div> 
      </div> 
     </div> 
     <div class="wrapper-Member" style="padding-bottom: 30px; margin-bottom: 5px; width: 100%; min-height: 550px;"> 
      <h2>اضافه کردن کارشناس جدید 
      </h2> 
      <br /> 
      <br /> 
      <br /> 
      <div class="editor-label"> 
       انتخاب معاونت 
      </div> 
      <div class="editor-field"> 
       @Html.DropDownListFor(model => model.AssistanceId, (SelectList)ViewBag.listAssistance) 
      </div> 

      <div class="editor-label"> 
       انتخاب کارشناس 
      </div> 
      @*    <div class="editor-field"> 
        @Html.DropDownListFor(model => model.userId, (SelectList)ViewBag.listDisableExpert) 
       </div>*@ 
      @{ 
    if (User.IsInRole("Expert") || User.IsInRole("Admin")) 
    { 
       <div class="wrapper-Member" style="border-top: 1px solid #d3d3d3; margin-top: 30px; width: 99.5%; border-left: 1px solid #d3d3d3; margin-right: 1px"> 
        <div class="tab-list-company" style="margin-right: -1px; width: 180px"> 
         <h2 style="font: normal 13px BHoma; margin-right: 10px; margin-top: 2px;">اختصاص کارشناس به معاونت 
         </h2> 
        </div> 
        <div class="list-company" style="border: none; width: 98%"> 
         <table> 
          <thead> 
           <tr> 
            <th>نام و نام خانوادگی</th> 
            <th>سطح تحصیلات</th> 
            <th>رشته تحصیلی</th> 
            <th>شماره همراه</th> 
            <th>تلفن</th> 
            <th>ایمیل</th> 
            @if (User.IsInRole("Expert") || User.IsInRole("Admin")) 
            { 
             <th style="width: 20px;">اضافه</th> 
            } 
           </tr> 
          </thead> 
          @{ 
            userRepository objUserRepository = new userRepository(); 
            //var listJuror = objUserRepository.FindBy(i => i.Permission == "Juror").ToList(); 
           List<DomainClass.User> listDisableAssistance = objUserRepository.ReturnUserByEnablePermission("غیرفعال", "Assistance"); 
          } 

          @foreach (var temp in listDisableAssistance) 
          { 
           <tr> 
            <td> 
             @{ 
           string fullName = temp.Name + " " + temp.Family; 
             } 
             @Html.DisplayFor(modelItem => fullName) 
            </td> 
            <td> 
             @Html.DisplayFor(modelItem => temp.EducationLevel) 
            </td> 
            <td> 
             @Html.DisplayFor(modelItem => temp.Field) 
            </td> 
            <td> 
             @Html.DisplayFor(modelItem => temp.Mobile) 
            </td> 
            <td> 
             @Html.DisplayFor(modelItem => temp.Tell) 
            </td> 
            <td> 
             @Html.DisplayFor(modelItem => temp.Email) 
            </td> 
            <td> 


              @using (Html.BeginForm("AddExpert", "Assistance", routeValues: new { userid = temp.Id })) 
             { 
             <input type="submit" value="" class="Add" title="اضافه کردن" /> 
             }  
            </td> 
           </tr> 
          } 

         </table> 
        </div> 
       </div> 
    } 
      } 
     </div> 
    </div> 

} 
@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 

在這部分

<td> 


               @using (Html.BeginForm("AddExpert", "Assistance", routeValues: new { userid = temp.Id })) 
              { 
              <input type="submit" value="" class="Add" title="اضافه کردن" /> 
              }  
             </td> 

我想通過我的userId我的行動,但它不起作用,我得到一個錯誤,說用戶ID爲空。

問候

+0

您生成嵌套窗體。不知道它的問題,但其無效的HTML和不支持的標準,所以你應該考慮改變它。如果模型不爲null,那麼我認爲它必須冒泡到外部形式並提交,以便內部形式路由值可以被忽略。 – 2014-08-29 12:11:03

+0

您的電話是否以userid null的動作到達? – faby 2014-08-29 13:14:06

+0

@faby在第一次,我點擊提交我得到這個錯誤:參數字典中包含一個空條目參數'userid'of不可空的類型'System.Int32'方法'System.Web.Mvc.ActionResult AddExpert( 'Presentation.Controllers.AssistanceController'中的'DomainClass.AssistanceJuror,Int32')。可選參數必須是引用類型,可爲空類型,或者聲明爲可選參數。 參數名稱:參數 – 2014-08-29 13:18:45

回答

0

到MVC的最好的方法是在你的GET方法來創建一個模型,在視圖中使用它,並在POST接受早報動詞的行動模式。因此,創建在其中添加所有的財產(也是用戶ID)的模型類,在視圖中添加頂部

@model YourClassModel 

和你的POST方法

public ActionResult AddExpert(YourClassModel model) 
1

我覺得現在的問題是您沒有將assistanceJuror參數發送到控制器。

new { userid = temp.Id } 

應該

new {assistanceJuror= value, userid = temp.Id } 

但我認爲這AssistanceJuror是一個複雜的類型,所以你會得到一個錯誤。嘗試只發送一個id(例如)並從控制器的數據庫中獲取信息。

像這樣的事情

public ActionResult AddExpert(string assistanceJurorId,int UserId) 
     { 
      var assistanceJuror= //get Your Variable Here; 
      User user = objUserRepository.FindBy(i => i.Id == assistanceJuror.UserId).First(); 
      user.Enable = "فعال"; 
      assistanceJuror.Date = DateTime.Now; 
      objUserRepository.Edit(user); 
      objUserRepository.Save(); 
      objAssistanceJurorRepository.Add(assistanceJuror); 
      TempData["Message"] = "کارشناس به معاونت اختصاص داده شد"; 
      objAssistanceJurorRepository.Save(); 
      return RedirectToAction("IndexExpert", "Assistance"); 
     } 

,並從該視圖

@using (Html.BeginForm("AddExpert", "Assistance", routeValues: new {assistanceJurorId= model.AssistanceId, userid = temp.Id })) 

這樣稱呼它以這種方式你是不是通過下拉列表中選定的值(存儲在model.AssistanceId變量)給控制器

assistanceJurorId= model.AssistanceId 

但是pr的初始值在模型operty因爲下拉列表以這種方式

@Html.DropDownListFor(x => x.AssistanceId, (SelectList)ViewBag.listAssistance)) 

要發送的下拉列表中選擇元素的正確值,我建議你刪除HTML是製作。 BeginForm並只在提交表單時向您的控制器發送ajax調用。這樣你就可以確保發送正確的值。

+0

那麼assitanceId怎麼樣?我怎麼把它傳遞給控制器​​? – 2014-08-29 14:33:45

+0

看看我更新的答案,並讓我知道 – faby 2014-08-29 14:36:58

+0

@faby,_「這樣你就傳遞了下拉列表的選定值」_。不,你不是。 Razor代碼在服務器上解析,所以'BeginForm()'方法中創建的路由基於'AssistanceId'的初始值,而不是用戶在瀏覽器中選擇的值。 – 2014-08-29 22:08:54