Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# asp.net 3.5“我是谁?”;获得;这_C#_Visual Studio 2008_Webforms_Asp.net 3.5 - Fatal编程技术网

C# asp.net 3.5“我是谁?”;获得;这

C# asp.net 3.5“我是谁?”;获得;这,c#,visual-studio-2008,webforms,asp.net-3.5,C#,Visual Studio 2008,Webforms,Asp.net 3.5,我正在使用Visual Studio 2008学习ASP.NET 3.5和C#。我学到的大部分东西都是通过MSDN。我正在尝试开发一个网页,允许用户创建一个角色用于RPG游戏。用户应该能够分配属性、购买物品等。当用户完成后,网站将使用用户数据格式化一个可打印的字符表 现在,我仍在为这件事绞尽脑汁,我想知道我是否走上了正确的道路——如果有人想看看我到目前为止所做的事情并发表评论,那将是非常棒的。我对任何我做错或效率低下的事情感兴趣,糟糕的设计,蹩脚的代码,以及我可以改进的方法。但最重要的是,我只想

我正在使用Visual Studio 2008学习ASP.NET 3.5和C#。我学到的大部分东西都是通过MSDN。我正在尝试开发一个网页,允许用户创建一个角色用于RPG游戏。用户应该能够分配属性、购买物品等。当用户完成后,网站将使用用户数据格式化一个可打印的字符表

现在,我仍在为这件事绞尽脑汁,我想知道我是否走上了正确的道路——如果有人想看看我到目前为止所做的事情并发表评论,那将是非常棒的。我对任何我做错或效率低下的事情感兴趣,糟糕的设计,蹩脚的代码,以及我可以改进的方法。但最重要的是,我只想知道我是否在正确的轨道上,没有滥用这项技术

下面是我到目前为止的代码。它允许用户将一定数量的点数分配给4个统计数据

主页:

<%@ Page Language="C#" 
    AutoEventWireup="true"  
    CodeFile="Default.aspx.cs" 
    Inherits="_Default" 
    enableSessionState="true"
%>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <!-- MPCP/Bod/Evasion/Masking/Sensor -->


        <asp:Label ID="MPCP_Rating" runat="server" Text="" ></asp:Label>
        <br /> <br />
        <asp:Label ID="PersonaPool" runat="server" Text="" ></asp:Label>
        <br /> <br />

        <!-- TODO: Format into table -->
        Bod:
        <asp:TextBox ID="Bod" runat="server" ontextchanged="Bod_TextChanged" 
            width="25px">0</asp:TextBox> 
        <asp:Button ID="BodInc" runat="server" Text="+" 
            OnClick="Bod_Inc" />
        <asp:Button ID="BodDec" runat="server" Text="-"
            OnClick="Bod_Dec"/>
        <br /> <br />

        Evasion:
        <asp:TextBox ID="Evasion" runat="server" ontextchanged="Evasion_TextChanged"
            width="25px">0</asp:TextBox>
        <asp:Button ID="EvasionInc" runat="server" Text="+" 
            OnClick="Evasion_Inc" />
        <asp:Button ID="EvasionDec" runat="server" Text="-" 
            OnClick="Evasion_Dec" /> 
        <br /> <br />

        Masking:
        <asp:TextBox ID="Masking" runat="server" ontextchanged="Masking_TextChanged"
            width="25px">0</asp:TextBox>
        <asp:Button ID="MaskingInc" runat="server" Text="+" 
            OnClick="Masking_Inc" />
        <asp:Button ID="MaskingDec" runat="server" Text="-" 
            OnClick="Masking_Dec" /> 
        <br /> <br />

        Sensor:
        <asp:TextBox ID="Sensor" runat="server" ontextchanged="Sensor_TextChanged"
            width="25px">0</asp:TextBox>
        <asp:Button ID="SensorInc" runat="server" Text="+" 
            OnClick="Sensor_Inc" />
        <asp:Button ID="SensorDec" runat="server" Text="-" 
            OnClick="Sensor_Dec" /> 
        <br /> <br />
        <asp:Button ID="Submit" runat="server" Text="Submit" />

    </div>
    </form>
</body>
</html>
应用程序数据(仅DeckData类)

使用系统;
使用系统数据;
使用系统配置;
使用System.Linq;
使用System.Web;
使用System.Web.Security;
使用System.Web.UI;
使用System.Web.UI.HTMLControl;
使用System.Web.UI.WebControl;
使用System.Web.UI.WebControl.WebParts;
使用System.Xml.Linq;
/// 
///存储与数据组相关的数据,并提供调整数据组数据的方法
/// 
公共类数据
{
//设置角色乘数,确定最大角色池
私人建筑乘数=3;
公共数据(uint MPCP)
{
_MPCP=MPCP;
_生化需氧量=_规避=_掩蔽=_传感器=0;
CalculateMaxPersona();
}
//MPCP/Bod/规避/掩蔽/传感器
公共枚举属性
{
MPCP,
董事会,
逃避
掩蔽,
传感器
}
私人单位(MPCP);
私人董事会;
私自回避;
私人单位屏蔽;
专用uint_传感器;
私人单位;
/// 
///助理/修饰语
/// 
公共uint MPCP
{
获取{return\u MPCP;}
设置{u MPCP=value;}
}
公共部门董事会
{
获取{return\u Bod;}
设置{u Bod=value;}
}
公众避税
{
获取{return\u规避;}
设置{u规避=值;}
}
公共单位掩蔽
{
获取{return\u Masking;}
设置{u Masking=value;}
}
公共单元传感器
{
获取{return\u Sensor;}
设置{u传感器=值;}
}
公共部门
{
获取{return\u PersonaMax;}
}
/// 
///计算可用角色。必须在更改属性之前调用,以确保
///角色池仍然有效
/// 
/// 
公共uint CalculateAvailPersona()
{
//总甲板属性
uint attrTotal=\u Bod+\u规避+\u掩蔽+\u传感器;
return _PersonaMax-attrotal;
}
/// 
///重新计算最大人物角色
/// 
私有uint CalculateMappersona()
{
_PersonaMax=\u MPCP*\u PersonaMax;
返回最大值;
}
/// 
///将属性增加1点
/// 
/// 
///要增加的属性
/// 
/// 
///如果没有可用的角色,则为false
///如果属性成功递增,则为true
/// 
公共布尔去属性(DeckData.Attributes atr)
{
uint availPersona=CalculateAvailPersona();
如果(availPersona==\u PersonalMax)
返回false;
交换机(atr)
{
case Attributes.MPCP:
打破
案例属性。Bod:
如果(_Bod>0)//检查底流
_生化需氧量-=1;
打破
案例属性。规避:
如果(_规避>0)
_回避-=1;
打破
案例属性。屏蔽:
如果(_Masking>0)
_掩蔽-=1;
打破
案例属性。传感器:
如果(传感器>0)
_传感器-=1;
打破
}
//检查是否使用缓存的角色更新了属性
if(availPersona!=CalculateAvailPersona())
返回true;
返回false;
}
公共布尔属性(DeckData.Attributes atr)
{
uint availPersona=CalculateAvailPersona();
如果(availPersona==0)
返回false;
交换机(atr)
{
case Attributes.MPCP:
打破
案例属性。Bod:
_生化需氧量+=1;
打破
案例属性。规避:
_回避+=1;
打破
案例属性。屏蔽:
_掩蔽+=1;
打破
案例属性。传感器:
_传感器+=1;
打破
}
返回true;
}
}

谢谢

如果你擅长html,放弃webforms,使用mvc框架,比如或


如果你不擅长html,学习html,放弃webforms并使用mvc框架。

如果你擅长html,放弃webforms并使用mvc框架,如或


如果你不擅长html,那就学习html,放弃webforms,使用mvc框架。

I'v刚刚快速查看了你的代码,其中一件事是使用你的web应用程序会涉及到大量的服务器回发。对属性的每一次更改都会导致页面被提交回服务器,虽然技术上没有问题,但不会带来良好的用户体验

您可能希望研究允许用户进行所有修改然后一起提交的技术(例如在客户端使用javascript来维护属性点的分布)或者,也可以考虑使用AJAX将修改异步发回服务器,从而获得更流畅的用户体验
using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class _Default : System.Web.UI.Page
{
    private DeckData deck;

    public _Default()
    {
    }

    // Page events
    protected void Page_Load(object sender, EventArgs e)
    {
        deck = (DeckData)(System.Web.HttpContext.Current.Session["Deck"]);
        MPCP_Rating.Text = "MPCP Rating: " + deck.MPCP.ToString();
        UpdateAvailPersona();
    }

    protected void Unload(object sender, EventArgs e)
    {
    }

    // Helper functions
    protected void ChangeAttribute(DeckData.Attributes atr, bool inc)
    {
        if (inc == true) 
            deck.IncAttribute(atr); 
        else  
            deck.DecAttribute(atr); 

        UpdateAvailPersona();

        switch (atr)
        {
            case DeckData.Attributes.Bod:
                Bod.Text = deck.Bod.ToString();
                break;
            case DeckData.Attributes.Evasion:
                Evasion.Text = deck.Evasion.ToString();
                break;
            case DeckData.Attributes.Masking:
                Masking.Text = deck.Masking.ToString();
                break;
            case DeckData.Attributes.Sensor:
                Sensor.Text = deck.Sensor.ToString();
                break;
        }
    }

    protected void UpdateAvailPersona()
    {
        PersonaPool.Text = "Persona Pool: " + deck.PersonaMax.ToString() +
            " / " + (deck.CalculateAvailPersona()).ToString();
    }

    // Control Events 
    protected void Bod_Dec(object sender, EventArgs e)
    {
        ChangeAttribute(DeckData.Attributes.Bod, false);
    }

    protected void Bod_Inc(object sender, EventArgs e)
    {
        ChangeAttribute(DeckData.Attributes.Bod, true);
    }

    protected void Evasion_Dec(object sender, EventArgs e)
    {
        ChangeAttribute(DeckData.Attributes.Evasion, false);
    }

    protected void Evasion_Inc(object sender, EventArgs e)
    {
        ChangeAttribute(DeckData.Attributes.Evasion, true);
    }

    protected void Masking_Dec(object sender, EventArgs e)
    {
        ChangeAttribute(DeckData.Attributes.Masking, false);
    }

    protected void Masking_Inc(object sender, EventArgs e)
    {
        ChangeAttribute(DeckData.Attributes.Masking, true);
    }

    protected void Sensor_Dec(object sender, EventArgs e)
    {
        ChangeAttribute(DeckData.Attributes.Sensor, false);
    }

    protected void Sensor_Inc(object sender, EventArgs e)
    {
        ChangeAttribute(DeckData.Attributes.Sensor, true);
    }
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

/// <summary>
/// Store deck related data and provide methods for adjusting deck data
/// </summary>
public class DeckData
{
    // Set persona multiplier, determines max persona pool
    private const uint _PersonaMultiplier = 3;

    public DeckData(uint MPCP)
    {
        _MPCP = MPCP;
        _Bod = _Evasion = _Masking = _Sensor = 0;

        CalculateMaxPersona();
    }

    // MPCP/Bod/Evasion/Masking/Sensor
    public enum Attributes
    {
        MPCP,
        Bod,
        Evasion,
        Masking,
        Sensor
    }

    private uint _MPCP;
    private uint _Bod;
    private uint _Evasion;
    private uint _Masking;
    private uint _Sensor;

    private uint _PersonaMax;

    /// <summary>
    /// Acessor/Modifiers
    /// </summary>
    public uint MPCP
    {
        get { return _MPCP; }
        set { _MPCP = value; }
    }

    public uint Bod
    {
        get { return _Bod; }
        set { _Bod = value; }
    }

    public uint Evasion
    {
        get { return _Evasion; }
        set { _Evasion = value; }
    }

    public uint Masking
    {
        get { return _Masking; }
        set { _Masking = value; }
    }

    public uint Sensor
    {
        get { return _Sensor; }
        set { _Sensor = value; }
    }

    public uint PersonaMax
    {
        get { return _PersonaMax; }
    }

    /// <summary>
    /// Calculate available persona. Must be called before changing attribs to ensure
    /// persona pool remains valid
    /// </summary>
    /// <returns></returns>
    public uint CalculateAvailPersona()
    {
        // Total deck attribs
        uint attrTotal = _Bod + _Evasion + _Masking + _Sensor;

        return _PersonaMax - attrTotal;
    }

    /// <summary>
    /// Recalculate max persona
    /// </summary>
    private uint CalculateMaxPersona()
    {
        _PersonaMax = _MPCP * _PersonaMultiplier;
        return _PersonaMax;
    }

    /// <summary>
    /// Increment attribute by 1 point 
    /// </summary>
    /// <param name="atr">
    /// The attribute to increment
    /// </param>
    /// <returns>
    /// false if no Persona available
    /// true if attribute successfully incremented
    /// </returns>
    public bool DecAttribute(DeckData.Attributes atr)
    {
        uint availPersona = CalculateAvailPersona();

        if (availPersona == _PersonaMax)
            return false;

        switch (atr)
        {
            case Attributes.MPCP:
                break;
            case Attributes.Bod:
                if (_Bod > 0)               // Check for underflow
                    _Bod -= 1;
                break;
            case Attributes.Evasion:
                if (_Evasion > 0)
                    _Evasion -= 1;
                break;
            case Attributes.Masking:
                if (_Masking > 0)
                    _Masking -= 1;
                break;
            case Attributes.Sensor:
                if (Sensor > 0)
                    _Sensor -= 1;
                break;
        }

        // Check to see if we updated an attribute using cached persona
        if(availPersona != CalculateAvailPersona())
            return true;
        return false;
    }

    public bool IncAttribute(DeckData.Attributes atr)
    {
        uint availPersona = CalculateAvailPersona();

        if (availPersona == 0)
            return false;

        switch (atr)
        {
            case Attributes.MPCP:
                break;
            case Attributes.Bod:
                _Bod += 1;
                break;
            case Attributes.Evasion:
                _Evasion += 1;
                break;
            case Attributes.Masking:
                _Masking += 1;
                break;
            case Attributes.Sensor:
                _Sensor += 1;
                break;
        }

        return true;
    }
}
<asp:Button ID="BodInc" runat="server" CommandArgument="Increase" 
        CommandName="Bod" oncommand="AttributeButton_Command" Text="+" />
<asp:Button ID="BodDec" runat="server" CommandArgument="Increase" 
        CommandName="Bod" oncommand="AttributeButton_Command" Text="-" />
protected void AttributeButton_Command(object sender, CommandEventArgs e)
{
    string attriubuteName = e.CommandName;
    string action = e.CommandArgument;
    // Do stuff
}
Bod      + [0] =
Evasion  + [0] -
Masking  + [0] -
Sensor   + [0] -
Total       0
Maximum     ?