2017-09-12 16 views
1

ASP.netは私には新しく、既存のプロジェクトを手渡してきました。私はSO:Asp.Net WebForms - How to pass ViewData as param to User Controlを書きましたが、回答がなかったので明確ではありませんでした。asp.net c#ユーザーコントロールパラメータを生成

は、私がこれやりたい:

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> 
    <%} 
%> 

をしかし、それはと<uc:speciesgrid<%=species%>に失敗:

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

ユーザーコントロール:

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> 

1は<uc:speciesgrid runat="server" species=<%=species%>/>を取得しない方法働く?

+0

あなたがASCXを定義するためにMVCまたはWebフォームの方法を使用していますか?第1のポイント: 'runat =" server "'属性ブロックの値を設定する '<% ... %>'コードブロックで制御することはできません。剣道とASP.NET MVCを使用している場合は、ユーザコントロールレジスタの代わりに 'Html.Partial'または' Html.RenderPartial'を使用することを検討してください。 –

+0

Webフォーム。 'Partials'を使って試してみましょう。ありがとう! – HankCa

答えて

0

ありがとうございます@あなたのコメントの山本哲也。ここに私が思いついたのがあります。

私はSpeciesGridView.ascxは、<script ...ブロックを含めるのではなく、コードビヘイビアオブジェクトのほうがよいと思います。それは私と一緒に遊ぶためのものです。

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) 
       ...