2016-02-14 15 views
7

में ViewComponent से फ़ॉर्म सबमिट करें और नियंत्रक कार्रवाई करें, मैं ASP.NET 5, एमवीसी कोर एप्लिकेशन में ViewComponent में किसी फ़ॉर्म से ListItems जोड़ना चाहता हूं।एएसपी.NET कोर

घटक दृश्य (दृश्य \ साझा \ अवयव \ AddListItem \ Default.cshtml):

@model ShoppingList.Models.ListItem 
<form asp-action="Create"> 
    <div class="form-horizontal"> 
     <hr /> 
     <div asp-validation-summary="ValidationSummary.ModelOnly" class="text-danger"></div> 
     <!-- some fields omitted for brevity --> 
     <div class="form-group"> 
      <label asp-for="Description" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="Description" class="form-control" /> 
       <span asp-validation-for="Description" class="text-danger" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
</form> 

ViewComponent नियंत्रक (ViewComponents \ AddListItem.cs):

namespace ShoppingList.ViewComponents 
{ 
    public class AddListItem : ViewComponent 
    { 
     private readonly ApplicationDbContext _context; 

     public AddListItem(ApplicationDbContext context) 
     { 
      _context = context; 
     } 

     public IViewComponentResult Invoke(string listId) 
     { 
      return View(); 
     } 

     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public async Task<IViewComponentResult> Create (ListItem listItem) 
     { 
      _context.ListItem.Add(listItem); 
      await _context.SaveChangesAsync(); 
      return View(listItem); 
     } 

    } 
} 

घटक शुरू हो जाती है home.cshtml में:

@{ 
     ViewData["Title"] = "Home Page"; 
} 

@Component.Invoke("AddListItem", @ViewBag.DefaultListId) 

हालांकि, मैं इसे काम पर नहीं ला सकता। कुछ भी नहीं जोड़ा गया है।

+0

हो क्या आप इस व्यू कॉम्पोनेंट को बुला रहे हैं? – Dealdiane

+0

@ { व्यूडाटा ["शीर्षक"] = "होम पेज"; } @ घटक। इन्वोक ("AddListItem", @ ViewBag.DefaultListId) –

उत्तर

3

AddListItem को AddListItemViewComponent का नाम बदलें। यह एक ऐसा सम्मेलन है जिसका उपयोग घटक को खोजने के लिए एएसपी.नेट द्वारा किया जाता है - जो व्यू कॉम्पोनेंट्स को ViewComponent प्रत्यय के साथ समाप्त करने की आवश्यकता है। यदि आप इसे इस तरह से नहीं करना चाहते हैं, तो आप [ViewComponent] विशेषता के साथ कक्षा को सजाने और नाम की संपत्ति को जो भी नाम चाहते हैं उसे सेट कर सकते हैं।

इसके अलावा, Create विधि कभी भी लागू नहीं की जाएगी और ViewComponents कभी भी HttPost का जवाब नहीं देंगे क्योंकि इसका एकमात्र उद्देश्य दृश्य प्रदर्शित करना है और किसी पोस्टबैक के जवाब में कोड निष्पादित नहीं करना है। दृश्य केवल Invoke या इसके असीमित संस्करण InvokeAsync पर कॉल करेगा और कुछ और नहीं।

यह एक सा पहली बार में भ्रामक है, लेकिन एक आसान तरीका लगता है के बारे में यह एक शक्तिशाली Partial अर्थ है कि आप घटक वर्ग, डि अनुकूल में अधिक सामान कर सकते हैं, और साथ ही साथ परीक्षण करने के लिए आसान है में की तरह है।

ASP.NET टीम एक पृष्ठ है कि ViewComponents here

+0

मुझे लगता है कि लिंक बदल गया है या वह अनुभाग अब उपलब्ध नहीं है ... https://docs.microsoft.com/en-us/aspnet/ कोर/एमवीसी/विचार/दृश्य-घटक – JMG

+0

आपका मतलब है कि मैं व्यूपॉपेंट में HttpPost विधि को कॉल नहीं कर सकता? –

+0

@AProgrammer, यह सही है। ViewComponents को सामग्री प्रस्तुत करने के लिए डिज़ाइन किया गया है और अनुरोधों को संसाधित नहीं किया गया है। – Dealdiane

2

बताते हैं आपकी मदद की, @Dealdiane के लिए धन्यवाद दिया है।

दृश्य \ साझा \ अवयव \ AddListItem \ Default.cshtml

<form asp-controller="ListItems" asp-action="QuickCreate"> 
    <div class="form-horizontal"> 
     <hr /> 
     <div asp-validation-summary="ValidationSummary.ModelOnly" class="text-danger"></div> 

     <div class="form-group"> 
      <label asp-for="No" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="No" class="form-control" /> 
       <span asp-validation-for="No" class="text-danger" /> 
      </div> 
     </div> 
... 

नियंत्रकों \ ListItemsController.cs

// POST: ListItems/QuickCreate 
    // Create item without showing view, return to home 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> QuickCreate(ListItem listItem) 
    { 
      _context.ListItem.Add(listItem); 
      await _context.SaveChangesAsync(); 
      return Redirect("/"); 
    } 

:

में मामला किसी intested, यहाँ काम कर कोड है परियोजना में परियोजना का पूरा स्रोत कोड यहां पाया जा सकता है: GitHub ShoppingList