2014-10-09 25 views
7

MVC'ye yeni katılıyorum, lütfen bana kolay gelsin. MVC’de başlatılan bir projeye verildi ve buna eklenmesi söylendi. İki farklı modelden veriye ihtiyaç duyulan bir bölüme ulaşana kadar iyiydim. Şimdi sıkışıp kaldım ve patronum bunu dün yapılmasını istiyor. Eğer yapabilirsen lütfen yardım edin.MVC - Gönder tuşu çok parçalı görünümlerde çalışmıyor

İki kısmi görünüm ve bir gönderme düğmesi ile bir görünüm var. Kısmi görünümlerin her biri farklı bir model kullanır. Görünümler, kullanıcının değiştirebileceği ekranda bilgi görüntüler. Gönder düğmesine tıklanır. Kontrolörde, her iki modelden de verilere erişmek istiyorum (kullanıcının ekrana girdiği değerler). Şu anda, denetleyiciyi çağırmak için gönderme düğmesini bile alamıyorum. Bu, anında yardıma ihtiyacım olan bölümdür, ancak sonunda her iki modelin verisine denetleyiciden nasıl erişileceğini bilmem gerekecek.

İşte yapmak istediğim temel fikir:

enter image description here

Bu benim görünümdür: CreateContract.cshtml

<div class="container-fluid"> 
@using (Html.BeginForm("CreateContract", "CreateContract", FormMethod.Post, new { @class = "form-horizontal " })) 
{ 
       <div id="PartialDiv"> 
      @{ 
     Html.RenderPartial("ApplicationPartialView", new CarmelFinancialWeb.Models.ModelApplication()); 
     Html.RenderPartial("ContractPartialView"); 
      } 
     </div> 
      <input id="btnCreateContract" type="submit" class="btn btn-primary" value="Save" name="CreateContract" /> 
} 
    </div> 

Bu kontrolör CreateContractController.cs bir parçasıdır. Görünüm açıldığında ve düzgün çalıştığında bu yöntem vurulur.

 [AuthorizeAdmin] 
    public ActionResult CreateContract(string ID) 
    { 
     ModelContract obj_Contract = new ModelContract(); 

     obj_Contract.BuyerName = "MOCS"; 

     return View(@"~/Views/CreateContract/CreateContract.cshtml", obj_Contract); 
    } 

Bu, CreateContractController.cs denetleyicisinin bir parçasıdır. Bu yöntem, gönder düğmesine tıklandığında vurulmuyor. Dize ID değişkenini diğer yöntemden ve her iki ModelContract ve ModelApplication (ve bunların çeşitli kombinasyonları) dahil etmeyi denedim, ancak bu yöntemin çağrılmasını sağlayamıyorum.

 [AuthorizeAdmin] 
    [HttpPost] 
    public ActionResult CreateContract() 
    { 
     ModelApplication obj_App = new ModelApplication(); 
     return View(@"~/Views/CreateContract/CreateContract.cshtml", obj_App); 

    } 

Kısmi görünümler için denetleyicideki yöntemler. Bunlar da denilmiyor.

 public PartialViewResult ApplicationPartialView(string ID) 
    { 
     ModelApplication obj_App = new ModelApplication(); 

     if (ID != null && ID != "0" && ID != null && ID != "") 
     { 
      obj_App = objBllApplication.GetApplicationByID(int.Parse(ID)); 
     } 

     return PartialView("CreateContractApplicationPartialView"); 
    } 

    public PartialViewResult ContractContractPartialView() 
    { 
     ModelContract obj_Contract = new ModelContract(); 

     obj_Contract.DealerID = "MOCS"; 

     return PartialView("CreateContractContractPartialView"); 
    } 
+0

CreateContract sonrası sürümünü mü Daha önce çalıştın mı? Cevabın hayır olduğunu tahmin ederdim. Belki de formun ayrıntılarını alabilmesi için ModelContract örneğini alması gerekir. –

+0

Değiştireceğim ilk şey gönderme kontrolünüzdür. Bir giriş yerine bir düğme olarak olurdu. Bunu deneyin ve denetleyici eyleminizi çağırmaya başlayıp başlamadığına bakın. – Pheonyx

+0

Pheonyx: Düğmeye değiştirdiğimde bu hatayı alıyorum: "Sözlüğe aktarılan model öğesi," CarmelFinancialWeb.Models.ModelContract "türündedir, ancak bu sözlük 'CarmelFinancialWeb.Models.ModelApplication türünde bir model öğesi gerektirir. '." – boilers222

cevap

13

çok bu yeni konum, özellikle de bilmen için faydalıdır burada başlık altında gidiyor var. İlk olarak, bir görünüm yalnızca bir modeline sahip olabilir. Yüksek düzeydeki sebep, aslında, seçilen modelin tür olarak doldurduğu genel bir sınıf aracılığıyla gerçekleştirilmesidir. Burada olduğu gibi, kısmi görünümler kullanarak biraz hile yapabilirsiniz, ancak yine de bunlara örnek bir örnek almak zorundasınız. Denetleyicinizde bu kısmi parçaları temsil etmek için eylemler oluşturarak bunu yapmaya çalışıyorsunuz, ancak bunlar etkili bir şekilde işe yaramaz. Hiçbir zaman çağrılmadılar. Html.Partial veya Html.RenderPartial, belirtilen görünümü, yalnızca çağıran görünümle aynı modelle veya varsayılan olarak modele (ikinci parametre) bu yöntemlere iletilen nesneyle işleyecektir. Denetleyiciye geri gitmez.

MVC'de, kısmi olarak görmek istediğiniz gibi çalışan "çocuk eylemleri" adı verilen bir şey var. Bunun yerine Html.Action veya Html.RenderAction kullanarak, denetleyicinizde kısmi görünümleri döndüren bu eylemleri çağırabilirsiniz. gerçi orada iki şey:

  1. o zaman [ChildActionOnly] ile harekete süslemeleri gerektiğini, (yerine tam teşekküllü bir bakış) kısmi bir görünüm dönmek için gidiyoruz. Aksi takdirde, eylemler, tarayıcıdan doğrudan URL erişimine maruz kalır; bu, kısmi görünümü herhangi bir düzen olmadan, tek başına gösterecektir.

  2. Çocuk eylemleri yalnızca GET stili isteklerde kullanılabilir. Bir çocuk eylemine POST atamazsınız.

O, bu gibi şeyler için aslında en iyisi sadece formun tek tek bu alanların yerleri ayırmak için ilan edilecektir eğer formun ayrı alanlar oluşturmak için çocuk eylemleri kullanmak. Örneğin, hem giriş hem de kayıt konseptine sahip olduğunuz bir combo sayfası alın. Her bir alan grubunu oluşturmak için alt eylemleri kullanabilirsiniz, ancak oturum açma kısmı giriş işlemine POST ve kayıt bölümü de bir kayıt eylemine gönderilmelidir. Her iki formdan da aynı eyleme kadar her şeyi POST yapamazsınız.

Özel senaryonuzda, kısmi görünümler aslında yolun bir yoludur, ancak ana görünümünüzün modelini yalnızca alt modelleri içeren bir görünüm modeli olarak ayarlamalısınız. Örneğin:

public class MyAwesomeViewModel // name doesn't matter 
{ 
    public ModelApplication Application { get; set; } 
    public ModelContract Contract { get; set; } 
} 

Ardından, ana görünümde:

@model Namespace.To.MyAwesomeViewModel 

... 

@Html.Partial("ApplicationPartialView", Model.Application) 
@Html.Partial("ContractPartialView", Model.Contract) 

Son olarak, bir parametre olarak bu görünüm modeli alacağını sizin POST eylemi:

[HttpPost] 
public ActionResult CreateContract(MyAwesomeViewModel model) 
{ 
    ... 
} 
İlgili konular