2010-03-27 13 views
8

मेरे पास एक डेटाबेस तालिका है जो रिकॉर्ड करती है कि उपयोगकर्ता को किस प्रकाशन को एक्सेस करने की अनुमति है। तालिका बहुत सरल है - यह बस यूजर आईडी/प्रकाशन आईडी जोड़े संग्रहीत करता है:एएसपी.नेट एमवीसी में चेकबॉक्स का उपयोग करके मैं चयन सूची कैसे बना सकता हूं?

CREATE TABLE UserPublication (UserId INTEGER, PublicationID INTEGER) 

उसे किसी उपयोगकर्ता & प्रकाशन का मतलब है उपयोगकर्ता पहुँच गया है कि के लिए एक रिकॉर्ड की उपस्थिति; रिकॉर्ड की अनुपस्थिति का कोई मतलब नहीं है।

मैं अपने व्यवस्थापक उपयोगकर्ताओं को एक साधारण स्क्रीन के साथ प्रस्तुत करना चाहता हूं जो उन्हें कॉन्फ़िगर करने की अनुमति देता है कि उपयोगकर्ता कौन से प्रकाशनों तक पहुंच सकता है। मैं प्रत्येक संभावित प्रकाशन के लिए एक चेकबॉक्स दिखाना चाहता हूं, और उन लोगों को जांचें जिन्हें उपयोगकर्ता वर्तमान में एक्सेस कर सकता है। व्यवस्थापक उपयोगकर्ता तब किसी भी संख्या में प्रकाशनों की जांच या अन-जांच कर सकता है और फॉर्म जमा कर सकता है।

विभिन्न प्रकाशन प्रकार हैं, और मैं समान टाइप किए गए प्रकाशनों को एक साथ समूहित करना चाहता हूं - इसलिए मुझे प्रकाशनों को प्रस्तुत करने के तरीके पर नियंत्रण की आवश्यकता है (मैं सिर्फ एक फ्लैट सूची नहीं चाहता हूं)।

मेरा दृश्य मॉडल स्पष्ट रूप से सभी प्रकाशनों की एक सूची रखने की आवश्यकता है (क्योंकि मुझे वर्तमान चयन के बावजूद उन्हें सभी को प्रदर्शित करने की आवश्यकता है), और मुझे उन प्रकाशनों की एक सूची की भी आवश्यकता है जिनके पास वर्तमान में उपयोगकर्ता की पहुंच है। (मुझे यकीन नहीं है कि मैं एक सूची के साथ बेहतर होगा कि प्रत्येक आइटम में प्रकाशन आईडी और हां/नहीं फ़ील्ड शामिल है?)।

लेकिन जहां तक ​​मुझे मिला है। मुझे वास्तव में कोई जानकारी नहीं है कि कुछ चेकबॉक्स में इसे बाध्य करने के बारे में कैसे जाना है। मैं कहाँ से प्रारम्भ करूँ?

उत्तर

19

LINQ एसक्यूएल के लिए अपनी समस्या के लिए मॉडल इस तरह दिखता है:

namespace SelectProject.Models 
{ 
    public class UserPublicationSelector 
    { 
     public int UserPublicationID { get; set; } 
     public int UserID { get; set; } 
     public int PublicationID { get; set; } 
     public string PublicationName { get; set; } 
     public bool IsSelected { get; set; } 
    } 

    public class UserPublicationSelectViewModel 
    { 
     public User User { get; set; } 
     public IQueryable Selections { get; set; } 
    } 
} 

अब:

alt text http://i39.tinypic.com/m78d1y.jpg

सबसे पहले, हम कुछ सहायक हमारे डेटा मॉडल में वस्तुओं की जरूरत है आइए रिपोजिटरी बनाएं जो इस तरह दिखता है:

public class Repository 
{ 
    DataContext dc = new DataContext(); 

    public User GetUser(int userID) 
    { 
     return dc.Users.FirstOrDefault(u => u.UserID == userID); 
    } 

    public IQueryable GetUserPublications(int userID) 
    { 
     return from p in dc.Publications 
       join up in dc.UserPublications on p.PublicationID equals up.PublicationID 
       where up.UserID == userID 
       orderby p.PublicationName 
       select p; 
    } 
    public IQueryable GetUserPublicationSelectors(int userID) 
    { 
     return from p in dc.Publications 
       join up in dc.UserPublications on p.PublicationID equals up.PublicationID into selected 
       from s in selected.DefaultIfEmpty() 
       orderby p.PublicationName 
       select new UserPublicationSelector 
       { 
        UserPublicationID = (int?)s.UserPublicationID ?? 0, 
        UserID = userID, 
        PublicationID = p.PublicationID, 
        PublicationName = p.PublicationName, 
        IsSelected = s.UserID != null 
       }; 
    } 

    public void UpdateUserPublications(UserPublicationSelector[] selections) 
    { 
     // Insert records for new selections... 
     foreach (UserPublicationSelector selection in selections.Where(s => s.IsSelected == true)) 
     { 
      // ...where records do not yet exist in database. 
      if (selection.UserPublicationID == 0) 
      { 
       UserPublication up = new UserPublication 
       { 
        UserID = selection.UserID, 
        PublicationID = selection.PublicationID, 
       }; 
       dc.UserPublications.InsertOnSubmit(up); 
      } 
     } 
     // Delete records for unselected items... 
     foreach (UserPublicationSelector selection in selections.Where(s => s.IsSelected == false)) 
     { 
      // ...where record exists in database. 
      if (selection.UserPublicationID > 0) 
      { 
       UserPublication up = dc.UserPublications.FirstOrDefault(s => s.UserPublicationID == selection.UserPublicationID); 
       if (up.UserID == selection.UserID && up.PublicationID == selection.PublicationID) 
        dc.UserPublications.DeleteOnSubmit(up); 
      } 
     } 
     // Update the database 
     dc.SubmitChanges(); 
    } 
} 

और एक नियंत्रक कि इस तरह दिखता है:

public class PublicationController : Controller 
{ 
    Repository repository = new Repository(); 

    public ActionResult Index(int id) 
    { 
     User user = repository.GetUser(id); 
     var publications = repository.GetUserPublications(id); 
     ViewData["UserName"] = user.UserName; 
     ViewData["UserID"] = user.UserID; 
     return View("Index", publications); 
    } 

    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Select(int id) 
    { 
     var viewModel = new UserPublicationSelectViewModel() 
     { 
      User = repository.GetUser(id), 
      Selections = repository.GetUserPublicationSelectors(id) 
     }; 
     return View("Select", viewModel); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Select(int userID, UserPublicationSelector[] selections) 
    { 
     repository.UpdateUserPublications(selections); 
     return RedirectToAction("Index", new { id = userID }); 
    } 
} 

सूचकांक दृश्य इस तरह दिखता है:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<Publication>>" %> 
<%@ Import Namespace="SelectProject.Models" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    List of Selected Publications for User 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <h2>Publications for <%= ViewData["UserName"] %></h2> 

     <table id="MyTable" style="width: 100%"> 
      <thead> 
       <tr> 
        <th> 
         Publication Name 
        </th> 
       </tr> 
      </thead> 

      <tbody> 
       <% int i = 0; 
        foreach (Publication item in Model) 
        { %> 

        <tr id="row<%= i.ToString() %>"> 
         <td> 
          <%= Html.Encode(item.PublicationName)%> 
         </td> 
        </tr> 

        <% i++; 
        } %> 
      </tbody> 
     </table> 
     <p> 
      <%= Html.ActionLink("Edit Selections", "Select", new { id = ViewData["UserID"] })%> 
     </p> 

</asp:Content> 

और दृश्य चुनें इस तरह दिखता है:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<UserPublicationSelectViewModel>" %> 
<%@ Import Namespace="SelectProject.Models" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    Select Publications 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <h2>Select Publications for <%= Model.User.UserName %></h2> 

    <% using (Html.BeginForm()) 
     { %> 

     <table id="MyTable" style="width: 100%"> 
      <thead> 
       <tr> 
        <th style="width: 50px; text-align:center"> 
         <input type="checkbox" id="SelectAll" /> 
        </th> 
        <th> 
         Publication Name 
        </th> 
       </tr> 
      </thead> 

      <tbody> 
       <% int i = 0; 
        foreach (UserPublicationSelector item in Model.Selections) 
        { %> 

        <tr id="row<%= i.ToString() %>"> 
         <td align="center" style="padding: 0 0 0 0"> 
          <%= Html.CheckBox("selections[" + i.ToString() + "].IsSelected", item.IsSelected)%> 
          <%= Html.Hidden("selections[" + i.ToString() + "].UserPublicationID", item.UserPublicationID)%> 
          <%= Html.Hidden("selections[" + i.ToString() + "].UserID", Model.User.UserID)%> 
          <%= Html.Hidden("selections[" + i.ToString() + "].PublicationID", item.PublicationID)%> 
         </td> 
         <td> 
          <%= Html.Encode(item.PublicationName)%> 
         </td> 
        </tr> 

        <% i++; 
        } %> 
      </tbody> 
     </table> 
     <p> 
      <%= Html.Hidden("userID", Model.User.UserID) %> 
      <input type="submit" value="save" /> 
     </p> 

    <% } // End Form %> 

    <script src="../../Scripts/jquery-1.4.1.js" type="text/javascript"></script> 

    <script type="text/javascript"> 
     // Select All Checkboxes 
     $(document).ready(function() { 
      $('#SelectAll').click(function() { 
       var newValue = this.checked; 
       $('input:checkbox').not('input:hidden').each(function() { 
        this.checked = newValue; 
       }); 
      }); 
     }); 
    </script> 

</asp:Content> 

यहां कुछ स्क्रीन शॉट्स हैं।

alt text http://i43.tinypic.com/2yl07kw.jpg

alt text http://i44.tinypic.com/mhulua.jpg

ऊपरी बाएँ हाथ के कोने में चेकबॉक्स एक सभी का चयन/चयन कोई नहीं चेकबॉक्स है।

+0

बहुत बढ़िया उत्तर, धन्यवाद। मुझे थोड़ा गंदे लगता है, जैसे मैंने आपको अपना होमवर्क करने के लिए भुगतान किया :-) –

+0

हाय रॉबर्ट, गहराई से जवाब में उत्कृष्ट !, धन्यवाद .. मैं वापस पोस्ट (सहेजने) मूल्यों के साथ चेक बॉक्स कैसे पोस्ट करूं? – TonyP

+1

@ टोनीपी: यह कार्यक्षमता चयन दृश्य में है, 'AcceptVerbs HttpVerbs.Post' विशेषता मान के साथ 'चयन करें' नियंत्रक विधि, और ऊपर दिए गए UpdateUserPublications रिपोजिटरी विधि के साथ। –

संबंधित मुद्दे

 संबंधित मुद्दे