2017-09-12 3 views
1

ASP.net est nouveau pour moi et j'ai reçu un projet existant sur lequel travailler. J'ai écrit SO: Asp.Net WebForms - How to pass ViewData as param to User Control mais je ne devais pas être clair car il n'y avait pas de réponses.asp.net C# générer des paramètres de contrôle utilisateur

Je veux faire:

Consignment.ascx: 

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Daff.Lae.TraceCommon.ValueObjects.NoiReproNLS.NoiNlsVO>" %> 
<%@ Register TagPrefix="uc" TagName="speciesgrid" Src="~/Views/Noi/ReproNLS/SpeciesGridController.ascx" %> 

<% 
    var applicationId = ViewData["NoiId"]; 
    var applicationSpecies = ViewData["applicationSpecies"] as HashSet<string>; // Same as the JS var applicationSpecies but from server - needed to build page 
%> 

... 

<% 
    foreach (String species in applicationSpecies) 
    { 
     %> 
     <div id="<%=species%>_grid" style="display: none;"> 
      <uc:speciesgrid runat="server" species=<%=species%>/> 
     </div> 
    <%} 
%> 

Mais il échoue sur <%=species%> en <uc:speciesgrid avec:

{"Server tags cannot contain <% ... %> constructs."} 

Le contrôle de l'utilisateur:

SpeciesGridController.ascx 

<%@ Control Language="C#" ClassName="SpeciesGrid" %> 
<%@ Import Namespace="Kendo.Mvc.UI" %> 
<%@ Import Namespace="Daff.Lae.TraceCommon.ValueObjects.NoiReproNLS" %> 
<%@ Import Namespace="System.Diagnostics" %> 

<script runat="server"> 
    private IDictionary<string, object> readRouteValueDictionary = new Dictionary<string, object>(); 
    private int _applicationId; 
    private string _species; 

    public string species 
    { 
     set 
     { 
      if (!value.IsEmpty()) 
      { 
       _species = value; 
       readRouteValueDictionary.Add("species", value); 
      } 
     } 
     get 
     { 
      return _species; 
     } 
     ... 
    } 
</script> 

<fieldset> 
    <legend><%=species%></legend> 
    <div> 
     <% Html.Kendo().Grid<NoiNlsConsignmentVO>() 
       .Name("grdNlsConsignment"+species) 
       ... 
     %> 
    </div> 
</fieldset> 

Comment peut-on obtenir le <uc:speciesgrid runat="server" species=<%=species%>/> travailler?

+0

Utilisez-vous MVC ou webforms façon de définir ASCX? Premier point: vous ne pouvez pas avoir le contrôle 'runat =" server "' avec le bloc de code '<% ... %>' pour définir les valeurs d'attribut. Si vous utilisez Kendo & ASP.NET MVC, envisagez d'utiliser 'Html.Partial' ou' Html.RenderPartial' à la place de l'approche du registre de contrôle utilisateur. –

+0

Formulaires Web. Je vais essayer d'utiliser 'Partials'. Merci! – HankCa

Répondre

0

Merci @Tetsuya Yamamoto pour votre commentaire. Voici ce que j'ai trouvé. Je pense que SpeciesGridView.ascx serait mieux avec un objet Code derrière plutôt que d'inclure un bloc <script .... C'est quelque chose pour moi de jouer avec.

Consignment.ascx 

<% 
    var applicationId = ViewData["NoiId"]; 
    var allSpecies = ViewData["allSpecies"] as List<ListItem>;  
%> 
... 

<% 
foreach (ListItem speciesItem in allSpecies) 
{ 
    var species = speciesItem.Value.Replace(" ", "_");%> 
    <div id="<%=species%>_grid" style="display: none;"> 
     <% 
      Html.RenderPartial("~/Views/Noi/ReproNLS/SpeciesGridView.ascx", new SpeciesGridViewDTO(NoiId : (int) applicationId, SpeciesCode : species)); 
     %> 
    </div> 
<%}%> 

SpeciesGridViewDTO.cs 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.Serialization; 

namespace Daff.Lae.TraceCommon.DTO.NoiReproNLS 
{ 
    /// <summary> 
    /// This DataTransferObject is for sending a succinct model to the SpeciesGridView 
    /// </summary> 
    [DataContract, Serializable] 
    public class SpeciesGridViewDTO 
    { 
     [DataMember] 
     public Int32 NoiId { get; set; } 

     [DataMember] 
     public String SpeciesCode { get; set; } 

     public SpeciesGridViewDTO(int NoiId, string SpeciesCode) 
     { 
      this.NoiId = NoiId; 
      this.SpeciesCode = SpeciesCode; 
     } 
    } 
} 

SpeciesGridView.ascx 

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Daff.Lae.TraceCommon.DTO.NoiReproNLS.SpeciesGridViewDTO>"%> 
<%@ Import Namespace="Daff.Lae.TraceCommon.ValueObjects" %> 

<%@ Import Namespace="Kendo.Mvc.UI" %> 
<%@ Import Namespace="Daff.Lae.TraceCommon.ValueObjects.NoiReproNLS" %> 
<%@ Import Namespace="System.Diagnostics" %> 


<%-- SpeciesGrid - render KendoGrid of NoiNlsConsignmentVO. --%> 

<script runat="server"> 
    private IDictionary<string, object> readRouteValueDictionary = new Dictionary<string, object>(); 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     readRouteValueDictionary.Add("applicationId", Model.NoiId); 
     // SpeciesCode is optional. If not given then all species are used. 
     if (! Model.SpeciesCode.IsEmpty()) 
     { 
      readRouteValueDictionary.Add("species", Model.SpeciesCode); 
     } 
    } 
</script> 
<fieldset> 
    <legend><%=Model.SpeciesCode%></legend> 
    <div> 

    <% Html.Kendo().Grid<NoiNlsConsignmentVO>() 
       .Name("grdNlsConsignment"+Model.SpeciesCode) 
       ...